Comment puis-je exécuter une Tâche que la valeur de retour et prend un paramètre? Je vois qu'il y a une méthode surchargée Task.Run<TResult>(Func<TResult>) mais comment je peut passer un paramètre?
Ici text est un capturé variable... donc, même si vous êtes juste à la création d'un Func<int>, c'est à l'aide de le paramètre de méthode.
C'est que "thread-safe"? En supposant que vous ne modifiez pas la valeur de text plus tard, il semble bien pour moi. Je pense que je suis juste oublier certains vraiment des trucs de base... si je l'appelle DoSomething plusieurs fois avec des valeurs différentes pour le texte, il y aura une copie de chaque version en mémoire pour chaque appel, droit? c'est à dire le lambda n'est pas possible d'utiliser la valeur de texte qui a été envoyé dans un autre appel de DoSomething? Il y aura un autre exemple d'un générées par le compilateur de la classe créée pour chaque appel. Donc, non, les appels à ne pas voir les uns les autres text valeurs.
Vous pouvez utiliser la Tâche.Usine.StartNew() surcharges de passer dans un "état" objet qui contient tous les paramètres que vous souhaitez vous utilisez. Voici un exemple très simple passage dans une NameValueCollection, mais vous pouvez bien évidemment passer dans n'importe quel type d'objet que vous avez voulu.
Task<bool>.Factory.StartNew(( a )=>{NameValueCollection nvc = a asNameValueCollection;if( nvc !=null){
nvc.AllKeys.ForEach( k =>Console.WriteLine( nvc[k]));}returntrue;},newNameValueCollection(){{"param1","hithere!"}});
Func<TResult>
ne prend pas de paramètre. En général, vous capture le paramètre à l'aide d'une expression lambda à la place. Par exemple:Ici
text
est un capturé variable... donc, même si vous êtes juste à la création d'unFunc<int>
, c'est à l'aide de le paramètre de méthode.En supposant que vous ne modifiez pas la valeur de
text
plus tard, il semble bien pour moi.Je pense que je suis juste oublier certains vraiment des trucs de base... si je l'appelle DoSomething plusieurs fois avec des valeurs différentes pour le texte, il y aura une copie de chaque version en mémoire pour chaque appel, droit?
c'est à dire le lambda n'est pas possible d'utiliser la valeur de texte qui a été envoyé dans un autre appel de DoSomething?
Il y aura un autre exemple d'un générées par le compilateur de la classe créée pour chaque appel. Donc, non, les appels à ne pas voir les uns les autres
text
valeurs.OriginalL'auteur Jon Skeet
Vous pouvez utiliser la Tâche.Usine.StartNew() surcharges de passer dans un "état" objet qui contient tous les paramètres que vous souhaitez vous utilisez. Voici un exemple très simple passage dans une NameValueCollection, mais vous pouvez bien évidemment passer dans n'importe quel type d'objet que vous avez voulu.
OriginalL'auteur Mike Parkhill