Je veux déclencher l'exécution d'une tâche sur un thread d'arrière-plan. Je ne veux pas attendre l'achèvement des tâches.
Dans .net 3.5, j'aurais fait ceci:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
Dans .net 4 le TPL est la manière suggérée. Le modèle courant, j'ai vu recommandée est de:
Task.Factory.StartNew(() => { DoSomething(); });
Cependant, l' StartNew()
méthode retourne un Task
objet qui implémente IDisposable
. Cette
semble être négligé par les personnes qui recommandent ce modèle. La documentation MSDN sur l' Task.Dispose()
méthode dit:
"Toujours faire appel à Éliminer avant de vous libérer de votre dernière référence à la Tâche."
Vous ne pouvez pas appeler disposer sur une tâche à la fois, afin d'avoir le thread principal d'attente et appeler dispose irait à l'encontre de la point de le faire sur un thread d'arrière-plan dans la première place. Il également n'a pas l'air d'être fini événement qui peut être utilisé pour le nettoyage.
La page MSDN sur la Tâche de la classe n'a pas de commentaire sur ce, et le livre "Pro C#2010...", recommande le même modèle et ne fait aucun commentaire sur la tâche de l'élimination.
Je sais que si je laisse le finaliseur l'attraper à la fin, mais est-ce que ça va revenir et de me mordre quand je suis en train de faire beaucoup de fire & forget tâches de ce genre et le finaliseur fil est dépassé?
Donc mes questions sont:
- Est-il acceptable de ne pas appeler
Dispose()
sur leTask
de la classe dans ce cas? Et si oui, pourquoi et il y a des risques/conséquences? - Est-il de la documentation sur ce sujet?
- Ou est-il un moyen approprié pour l'élimination de la
Task
objet que j'ai manqué? - Ou est-il une autre façon de faire le feu et oublier les tâches avec le TPL?