Je souhaite déclencher une tâche à exécuter sur un thread d'arrière-plan. Je ne veux pas attendre la fin des tâches.
Dans .net 3.5, j'aurais fait ceci:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
Dans .net 4, le TPL est la méthode suggérée. Le modèle commun que j'ai vu recommandé est:
Task.Factory.StartNew(() => { DoSomething(); });
Cependant, la StartNew()
méthode retourne un Task
objet qui implémente IDisposable
. Cela semble être négligé par les personnes qui recommandent ce modèle. La documentation MSDN sur la Task.Dispose()
méthode dit:
"Appelez toujours Dispose avant de libérer votre dernière référence à la tâche."
Vous ne pouvez pas appeler dispose sur une tâche jusqu'à ce qu'elle soit terminée, donc avoir le thread principal attendre et appeler dispose annulerait le point de faire sur un thread d'arrière-plan en premier lieu. Il ne semble pas non plus y avoir d'événement terminé / terminé qui pourrait être utilisé pour le nettoyage.
La page MSDN sur la classe Task ne commente pas cela, et le livre "Pro C # 2010 ..." recommande le même modèle et ne fait aucun commentaire sur l'élimination des tâches.
Je sais que si je le laisse simplement, le finaliseur l'attrapera à la fin, mais est-ce que cela va revenir et me mordre quand je fais beaucoup de feu et que j'oublie des tâches comme celle-ci et que le fil du finaliseur sera débordé?
Donc mes questions sont:
- Est-il acceptable de ne pas faire appel
Dispose()
à laTask
classe dans ce cas? Et si oui, pourquoi et y a-t-il des risques / conséquences? - Y a-t-il une documentation qui en parle?
- Ou y a-t-il un moyen approprié de disposer de l'
Task
objet que j'ai manqué? - Ou existe-t-il une autre façon de faire feu et oublier les tâches avec le TPL?