Je recommande d'utiliser la classe Task
(ajoutée dans .NET 4.0) si vous avez besoin de ce type de comportement. Il prend en charge l'annulation, et vous pouvez avoir n'importe quel nombre de tâches en écoutant le même jeton d'annulation, ce qui vous permet de les annuler tous avec un seul appel de méthode.
Mise à jour (solution non 4.0):
Vous avez vraiment que deux choix. Un: implémentez votre propre démultiplexeur d'événements (c'est beaucoup plus complexe qu'il n'y paraît, en raison de la limite d'attente de 64-handle); Je ne peux pas recommander ceci - je devais le faire une fois (dans le code non managé), et c'était hideux.
Cela laisse le deuxième choix: Avoir un signal pour annuler les tâches. Naturellement, RegisteredWaitHandle.Unregister
peut annuler la partie RWFSO. Le QUWI est plus complexe, mais peut être fait en rendant l'action consciente d'une valeur de "jeton". Lorsque l'action s'exécute, elle vérifie d'abord la valeur du jeton par rapport à sa valeur de jeton stockée; si elles sont différentes, alors il ne devrait rien faire.
Une chose importante à considérer est les conditions de course.N'oubliez pas qu'il existe une condition de concurrence entre l'annulation d'une action et le ThreadPool qui l'exécute, de sorte qu'il est possible de voir les actions en cours après l'annulation.
Je a blog post on this concept, que j'appelle « contextes de rappel asynchrone ». Le type CallbackContext
mentionné dans le billet de blog est disponible dans la bibliothèque Nito.Async.
Excellent conseil. –
+1, mais Management ne veut pas que .NET 4.0 soit implémenté dans notre infrastructure pour le moment. – jp2code
@ jp2code: C'est dommage; .NET 4.0 apporte d'énormes changements utiles au multithreading dans .NET. Voir ma réponse mise à jour pour une solution pré-NET 4.0. –