L'arrêt de tous les threads .NET pool de threads?
Je suis à l'aide de pool de threads .NET pour faire quelques requêtes web en arrière-plan, et je veux avoir un bouton "Stop" pour annuler toutes les discussions, même si elles sont en train de faire une demande, donc un simple booléen habitude de faire le travail.
Comment puis-je le faire?
OriginalL'auteur Meredith | 2011-02-22
Vous devez vous connecter pour publier un commentaire.
La bonne façon de gérer cela est d'avoir un drapeau de l'objet que vous signal.
Le code s'exécutant dans ces threads doit vérifier que le drapeau périodiquement pour voir si elle doit quitter.
Par exemple, un ManualResetEvent objet est adapté pour cela.
Vous pourrait alors demander au fils de sortie comme ceci:
et à l'intérieur les fils que vous devriez vérifier pour elle comme ceci:
Deuxièmement, depuis que vous utilisez le pool de threads, ce qui se passe, c'est que tous les articles que vous avez mis en file d'attente va encore être traitées, mais si vous ajoutez le if ci-dessus pour le début de la méthode de fil, il va le quitter immédiatement. Si ce n'est pas assez bon, vous devez construire votre propre système à l'aide de la normale fils, de cette façon, vous avez le contrôle complet.
Oh, et juste pour s'assurer que, ne pas utiliser Thread.L'abandonner. Poser les filets de sortie bien, ne pas carrément les tuer.
OriginalL'auteur Lasse Vågsæther Karlsen
Votre situation est à peu près la forme canonique de cas d'utilisation pour la Annulation modèle dans la .NET framework.
L'idée est que vous créez un CancellationToken objet et le rendre disponible pour l'opération que vous souhaitez annuler. Votre opération parfois vérifie le jeton de IsCancellationRequested des biens, ou des appels ThrowIfCancellationRequested.
Vous pouvez créer un CancellationToken, et demande l'annulation, à travers elle, à l'aide de la CancellationTokenSource classe.
Cette annulation modèle qui s'intègre bien avec le .NET Task Parallel Library, et il est assez léger, plus que d'utiliser le système des objets tels que des ManualResetEvent (bien que ce soit parfaitement valide la solution aussi).
OriginalL'auteur Wesley Hill
Si vous allez stop/cancel quelque chose de transformation dans un autre thread,
ThreadPool
n'est pas le meilleur choix, vous devez utiliserThread
au lieu de cela, et de gérer l'ensemble d'entre eux dans un récipient(par exemple un mondialList<Thread>
), qui garantit que vous avez le plein contrôle de tous les threads.OriginalL'auteur Cheng Chen