Maison >développement back-end >C++ >Dois-je disposer () des tâches TPL Fire-and-Forget ?

Dois-je disposer () des tâches TPL Fire-and-Forget ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-03 22:01:41311parcourir

Should I Dispose() of Fire-and-Forget TPL Tasks?

Comprendre la nécessité de Dispose() sur les tâches TPL

Lors de l'utilisation d'objets Task pour des tâches de tir et d'oubli, la question se pose : est-il nécessaire d'appeler Dispose ()?

Exécution du fil de discussion en arrière-plan et Task.Dispose()

La bibliothèque parallèle de tâches (TPL) permet l'exécution de tâches sur des threads en arrière-plan. Généralement, StartNew() est utilisé pour créer un objet Task, qui implémente IDisposable. Selon la documentation MSDN, il est recommandé d'appeler Dispose() avant de publier la dernière référence à la tâche.

Dilemme de la suppression des tâches en arrière-plan

Cependant, l'appel de Dispose() nécessite la tâche à accomplir, ce qui va à l’encontre de l’objectif de l’utilisation d’un thread en arrière-plan. De plus, aucun événement d'achèvement ne peut être utilisé pour le nettoyage.

Est-il acceptable de ne pas disposer() ?

Selon Stephen Toub de Microsoft, dans la plupart des cas , il est acceptable de ne pas appeler Dispose() sur les objets Task utilisés pour les continuations, car ils n'attribueront pas le handle d'attente interne. À partir de .Net 4.5, seule l'utilisation explicite de AsyncWaitHandle entraînera une allocation de handle d'attente.

Conséquences et risques

Toub note que les objets Task eux-mêmes n'ont pas de finaliseurs . Le handle d'attente a un finaliseur, mais il n'est alloué que lorsque cela est nécessaire. Par conséquent, le finaliseur ne sera pas exécuté à moins que le handle d'attente ne soit alloué.

Cependant, dans les cas où de nombreuses tâches de lancement et d'oubli sont créées, il est possible que le thread du finaliseur soit submergé si plusieurs tâches sont exécutées. des poignées d'attente sont allouées.

Documentation et bonnes pratiques

La page MSDN pour la classe Task ne n’aborde pas explicitement cette question. Cependant, le billet de blog de Stephen Toub, intitulé « Dois-je disposer des tâches ? » apporte des précisions supplémentaires et recommande de s'appuyer sur la finalisation dans la plupart des cas.

Approches alternatives

Si vous le souhaitez, il existe des moyens de vérifier la disponibilité du handle d'attente et de supprimer la tâche si elle a été allouée. Alternativement, on pourrait explorer d'autres options pour les tâches de lancement et d'oubli, telles que la méthode ThreadPool.QueueUserWorkItem ou l'utilisation des extensions réactives pour .NET (Rx).

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn