L'élimination des tâches est-elle nécessaire pour les tâches en arrière-plan déclenchées et oubliées ?
Lors de l'exécution de tâches déclenchées et oubliées sur des threads en arrière-plan, les développeurs utilisent souvent la méthode Task Parallel Library (TPL) Task.Factory.StartNew(). Cette méthode renvoie un objet Task, ce qui soulève des inquiétudes quant à son élimination appropriée.
la documentation msdn suggère d'appeler Dispose() avant de publier la dernière référence à une tâche. Cependant, attendre la fin de la tâche pour appeler cette méthode annule l'objectif de l'exécution en arrière-plan.
Discussion
Selon Stephen Toub de l'équipe Microsoft pfx, un objet Task peut envelopper un handle d’événement en attendant sa fin. Cependant, si des continuations sont utilisées, ce handle n’est jamais alloué. Par conséquent, la finalisation est une méthode de nettoyage adéquate.
Mise à jour (octobre 2012)
Article de blog de Toub "Dois-je me débarrasser des tâches ?" apporte des précisions supplémentaires. Dans .NET 4.5, une tâche alloue uniquement le handle d’attente interne lorsque AsyncWaitHandle est explicitement utilisé. De plus, Task n'a pas de finaliseur ; tout handle alloué est enveloppé dans un objet avec un finaliseur. Cela signifie qu'il n'est pas nécessaire de supprimer la plupart des objets Task.
Conclusions
Dans la plupart des cas, il est acceptable de s'abstenir d'appeler Dispose() sur les objets Task utilisés pour le feu. -et oubliez les tâches en arrière-plan. La finalisation suffira généralement pour le nettoyage des ressources. Cependant, si AsyncWaitHandle est utilisé ou si l'application dépend fortement de ces tâches, une suppression explicite peut être justifiée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!