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

Dois-je me débarrasser des tâches TPL Fire-and-Forget ?

Linda Hamilton
Libérer: 2025-01-05 16:26:42
original
862 Les gens l'ont consulté

Do I Need to Dispose of Fire-and-Forget TPL Tasks?

Ne pas supprimer les tâches TPL : conséquences et solutions alternatives

Lors du déclenchement d'une tâche pour qu'elle s'exécute en arrière-plan sans attendre son achèvement, le problème commun l'utilisation de Task.Factory.StartNew() soulève des questions sur la nécessité d'appeler Dispose() sur l'objet Task renvoyé. Bien que MSDN recommande de supprimer toutes les tâches, la question de la suppression des tâches dans ce scénario spécifique est souvent négligée.

Concernant les conséquences de la non-élimination, Stephen Toub, membre de l'équipe Microsoft PFX, clarifie que Task.Dispose() existe pour gérer un handle d'événement utilisé dans certains scénarios d'attente. Cependant, lorsque les continuations sont le principal moyen d'accéder à la tâche, ce handle d'événement ne sera jamais alloué. Stephen Toub suggère de s'appuyer sur la finalisation pour gérer ces tâches.

La documentation officielle sur ce sujet est limitée. Cependant, le billet de blog de Stephen Toub, « Dois-je disposer des tâches ? » développe ce problème et met en évidence les améliorations introduites dans .Net 4.5.

En général, vous n'avez pas besoin de disposer des tâches. des objets Task la plupart du temps. Les raisons de se débarrasser incluent la libération rapide des ressources non gérées et l'évitement du coût du finaliseur. Cependant, ces considérations ne s'appliquent généralement pas aux objets Task :

  • Dans .Net 4.5 et versions ultérieures, les handles d'attente internes ne sont alloués que lors de l'utilisation explicite de IAsyncResult.AsyncWaitHandle.
  • Les objets Task eux-mêmes n'avoir aucun finaliseur ; le handle d'attente est enveloppé dans un objet avec un finaliseur, qui n'est exécuté que si le handle est alloué.

Méthodes alternatives pour les tâches de déclenchement et d'oubli avec TPL :

Si l'élimination des objets de tâche reste un problème, il existe des approches alternatives :

  • Utilisez le Méthode ThreadPool.QueueUserWorkItem() dans .Net 3.5 ou version ultérieure.
  • Créez une tâche sans la renvoyer : Task.Run(() => DoSomething());.
  • Utilisez la tâche Méthode .ContinueWith pour joindre une suite qui effectuera un nettoyage automatique.

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal