Passage de paramètre dans une Tâche.Usine.StartNew
Donné le code suivant:
string injectedString = "Read string out of HttpContext";
Task.Factory.StartNew(() =>
{
MyClass myClass = new MyClass();
myClass.Method(injectedString);
}
Est-ce la meilleure façon de passer la chaîne dans la Tâche/Thread?
Mes soucis avec cette méthode sont:
- Serait le garbage collector de savoir quand la chaîne est devenue de
contexte et de la nettoyer correctement? - Est-il un meilleur moyen d'injecter des dépendances dans une Tâche de rupture du lien à l'objet dans le thread principal?
C'est dans un Asp.Net webservice, si elle est importante et est un feu et oublier le type de fil, je ne vais pas attendre pour tout type de réponse.
Ma chaîne est en fait aller le lire de la HttpContext
, qui est une des raisons pour lesquelles je suis à l'injecter dans ce processus (Thread n'a pas accès à l'appelant fils HtppContext
)
OriginalL'auteur Liam | 2013-11-18
Vous devez vous connecter pour publier un commentaire.
Votre lambda sera hissé dans un générés par le compilateur de la classe. Le
injectedString
variable va devenir un champ de la classe.Il sera donc, les ordures collectées lors de la classe générée est hors de portée (qui est en fait à la fin de votre lambda), et la GC décide de faire une collection.
En réponse à votre commentaire:
Il n'y a pas de chevauchement. Le compilateur transforme ce:
Dans cette:
Rappelez-vous aussi: les Chaînes de caractères sont internés dans le CLR. Même si le code a été dupliqué.. littéraux de chaîne seront internés dans une piscine. Vous serait essentiellement seulement un MOT native de la taille de référence dupliqué qui pointait à la chaîne (les littéraux de chaîne..)
Cela dépend vraiment de ce que vous faites avec les cordes. Avec ce que vous avez donné ici, l'ensemble de la chaîne de déclaration est optimisé et l'écart est plutôt remplacé par l'instanciation de l'généré par le compilateur, la classe et le terrain de classe est affectée de la valeur de la variable de chaîne. Je vais mettre à jour ma réponse afin de refléter ce que je veux dire.
OriginalL'auteur Simon Whitehead
Vous devriez probablement utiliser la
Task.Factory.StartNew(Action<object> action, object state)
surcharge de passer de l'état dans votre nouvelle tâche.La méthode DoSomething sur la chaîne est juste un exemple.... Permettez-moi de changer pour quelque chose qui ne compiler...
Pas sûr que ça répond à ma question, mais il est intéressant de voir comment l'état des œuvres. +1
Well done monsieur!!!
OriginalL'auteur tucaz
Si vous êtes préoccupé par
injectedString
peut être "nettoyés" avantmyClass.Method(injectedString);
fonctionne ?Réponse est pas. Vous n'avez pas besoin de s'inquiéter à ce sujet, car
injectedString
n'est pas plus une variable locale quand il est fermé dans lelambda
. Il deviendra un champ nouveau, généré par le compilateur de la classe.Si vous êtes concernés sur le garbage collector recueillir au bon moment?
La réponse est oui, Il le fera lorsque l'instance de cette classe est hors de portée et ne refernces en code managé. Qu'arriverait certainement après
Task
est achevé et devient hors de portée.mise à jour de ma réponse
OriginalL'auteur Sriram Sakthivel