ThreadPool.QueueUserWorkItem avec une lambda expression et de la méthode anonyme
En passant par deux paramètres à un nouveau sujet sur le pool de threads peut parfois être compliqué, mais il semble qu'avec les expressions lambda et les méthodes anonymes, je peux le faire:
public class TestClass
{
public void DoWork(string s1, string s2)
{
Console.WriteLine(s1);
Console.WriteLine(s2);
}
}
try
{
TestClass test = new TestClass();
string s1 = "Hello";
string s2 = "World";
ThreadPool.QueueUserWorkItem(
o => test.DoWork(s1, s2)
);
}
catch (Exception ex)
{
//exception logic
}
Maintenant, j'ai certainement simplifié cet exemple, mais ces points sont essentiels:
- La chaîne objets transmis sont immuables et donc des threads
- Le s1 et s2 sont les variables déclarées à l'intérieur de la portée du bloc try, qui je le quitter immédiatement après files d'attente le travail pour le pool de threads, de sorte que le s1 et s2 les variables ne sont jamais modifiés par la suite.
Est-il quelque chose de mal avec cela?
L'alternative est de créer une nouvelle classe qui implémente une immuable type avec 3 membres: test, s1 et s2. Qui semble juste comme un travail supplémentaire sans aucun avantage à ce point.
- Pourquoi ne pas simplement écrire
o => test.DoWork(s1, s2)
au lieu de la plus prolixe définition? - Parce que je suis vraiment nouveau dans les expressions lambda. 😉 merci!
- Je l'ai changé à la question.
Vous devez vous connecter pour publier un commentaire.
Il n'y a rien de mal à cela. Le compilateur est essentiellement de faire automatiquement ce que vous avez décrit comme votre alternative. Il crée une classe afin de conserver la capture de variables (test, s1 et s2) et transmet une instance de délégué pour le lambda qui est transformé en une méthode de la classe anonyme. En d'autres termes, si vous êtes allé de l'avant avec votre alternative vous vous retrouvez avec soemthing très semblable à ce que le compilateur qui vient d'être généré pour vous.
Pour cet exemple particulier, non il n'y a rien de mal ici. L'état que vous avez passé dans l'autre thread est entièrement contenue et aucun des types d'impliquer toute thread problèmes d'affinité.
C'est une belle façon de faire. Je ne vois pas les inconvénients de l'utilisation des expressions lambda. C'est simple et propre.
Ce que vous regardez est référencé comme une fermeture. Comme chuckj unis, le compilateur génère une classe au moment de la compilation, ce qui correspond pour les membres qui sont accessibles à l'extérieur de la clôture.
La seule chose que vous avez à vous soucier est de savoir si vous avez des ref ou des paramètres de sortie. Alors que les chaînes sont immuables, les références (ou variable) ne le sont PAS.
Un problème potentiel avec le motif est que c'est très tentant de le développer en quelque chose de plus générique, mais moins fort comme ceci (code à gratter - ne vous attendez pas à du travail):