Maison >développement back-end >C++ >Dois-je disposer () des tâches TPL Fire-and-Forget ?
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!