C# Anonyme Fil avec Lambda Syntaxe
En général je reçois de C#lambda de la syntaxe. Cependant, l'anonyme fil de la syntaxe n'est pas complètement clair pour moi. Quelqu'un peut-il expliquer ce qu'est un thread de création de ce genre est en train de faire? Veuillez être aussi précis que possible, j'aimerais avoir une sorte d'étape-par-étape sur la magie qui fait ce travail.
(new Thread(() => {
DoLongRunningWork();
MessageBox.Show("Long Running Work Finished!");
})).Start();
La partie que je ne comprends pas, c'est la Thread(() => ...
Lorsque j'utilise cette syntaxe, il semble comme je l'ai supprimer beaucoup de la limite d'une traditionnelle ThreadStart
tels que les invoquer sur une méthode qui n'a pas de paramètres.
Merci pour votre aide!
- il crée un nouvel objet thread en passant d'une méthode anonyme (délégué), et la démarre. C'est tout. La création de méthodes anonymes est essentiellement un moyen de transmettre un bloc de code en tant que délégué paramètre
Vous devez vous connecter pour publier un commentaire.
() => ...
signifie simplement que l'expression lambda ne prend pas de paramètres. Votre exemple est équivalente à la suivante:La
{ ... }
dans le lambda vous permettent d'utiliser plusieurs instructions dans le corps de lambda, où normalement vous auriez du être autorisées seulement une expression.Ce:
Est équivalent à:
new Thread(() => _Transaction_Finalize_Worker(transId, machine, info, newConfigPath)).Start();
- pourquoi ne puis-je maintenant passer de tous ces paramètres?Qu'il y a des réponses avant de me lancer, je vais écrire sur la façon dont d'autres paramètres dans le lambda.
Bref, cette chose qu'on appelle fermeture. Permet de disséquer votre exemple avec
new Thread(() => _Transaction_Finalize_Worker(transId, machine, info, newConfigPath)).Start();
en morceaux.Pour la fermeture il y a une différence entre la classe des " champs et des variables locales. Ainsi, supposons que
transId
est champ de la classe (donc accessible par le biais dethis.transId
) et d'autres sont des variables locales.Derrière les scènes si lambda utilisé dans une classe, le compilateur crée une classe imbriquée avec le nom ineffable, permet de le nom il
X
pour des raisons de simplicité, et met toutes les variables locales de là. Aussi il écrit lambda il y, de sorte qu'il devient normal de la méthode. Puis compilateur écrit de votre méthode de sorte qu'il créeX
à un certain point et remplace l'accès àmachine
,info
etnewConfigPath
avecx.machine
,x.info
etx.newConfigPath
respectivement. AussiX
reçoit référence àthis
, de sorte que la lambda-méthode pourrait accèstransId
viaparentRef.transId
.Bien, il est extrêmement simplifié, mais proche de la réalité.
UPD:
C'est de manière anonyme afin de créer un thread en C# qui vient de démarrer le thread (parce que vous êtes à l'aide de la méthode Start();)
Suivant 2 méthodes sont équivalentes. Si vous avez besoin de Thread variable pour faire quelque chose (par exemple bloquer le thread appelant en appelant thread0.join()), puis servez-vous de la 2e.
Maintenant la méthode de Fil de la partie. Si vous voyez le Fil de la déclaration, nous avons le suivant (j'ai omis les 3 autres).
Thread prend un délégué en tant que paramètre. Déléguer est une référence à une méthode. Fil prend un paramètre qui est un délégué. ThreadStart est déclarée comme telle.
Cela signifie que vous pouvez passer n'importe quel méthode de Thread qui retourne void et cela ne prend pas de paramètres. Donc les exemples suivants sont équivalents.
Maintenant, nous pensons que ThreadMethod méthode est faire peu de travail, nous pouvons le faire à locale et anonyme. Donc, nous n'avons pas besoin de la ThreadMethod méthode à tous.
Vous voir après délégué à la dernière accolades est l'équivalent de notre ThreadMethod(). Vous pouvez raccourcir le code précédent en introduisant Lambda déclaration (Voir MSDN). C'est juste que vous utilisez et de voir comment il a été terminé comme suit.