Comment faire pour annuler un appel asynchrone?
Comment annuler un appel asynchrone? L' .NET APM ne semble pas prendre en charge cette opération.
J'ai la boucle suivante dans mon code qui génère plusieurs threads sur le pool de threads. Lorsque je clique sur un bouton sur mon INTERFACE, je voudrais que ces threads (ou des appels asynchrones) à la fin.
foreach (var sku in skus)
{
loadSku.BeginInvoke(...
}
Est-il une solution élégante autres que la création d'une "Annuler drapeau" et d'avoir les méthodes asynchrones à la chercher?
Vous devez vous connecter pour publier un commentaire.
Un "indicateur annuler" est la façon de le faire, mais pas un global, nécessairement. L'inévitable point est que vous devez certains façon de signal sur le fil qu'il devrait arrêter ce qu'il fait.
Dans le cas de
BeginInvoke
, c'est difficile de faire avec rien, mais un indicateur global, parce que le travail est effectué sur le pool de threads, et vous ne savez pas quel thread. Vous avez deux options (dans l'ordre de préférence):BackgroundWorker
au lieu deBeginInvoke
. Cela a annulation de la fonctionnalité de boulangerie-en. Cela a d'autres avantages, comme le suivi des progrès, et "Œuvre complète" rappels. Il est également très efficace pour gère les exceptions.ThreadPool.QueueUserWorkItem
, en passant un objet que l'état a unCancel()
méthode qui définit unCancelled
drapeau que l'exécution du code peut vérifier. Bien sûr, vous aurez besoin de garder une référence à l'objet de l'état de sorte que vous pouvez appelerCancel()
sur elle (ce qui est quelque chose que l'BackgroundWorker
fait pour vous, - vous disposez d'un composant sur votre formulaire. (Merci à Fredrik de rappeler à ce sujet).ThreadStart
délégué, en passant dans un etat de l'objet comme avec l'option 2.WaitCallback
utilisé avec leThreadPool.QueueUserWorkItem
prend un paramètre d'état de l'objet, de sorte que peut également être utilisé, à la place de la création d'un custom ThreadStart délégués.Si vous êtes lookin pour un "TerminateAsnyc" méthode, vous n'aurez pas à en trouver un. Donc, non, il n'y a probablement pas de manière élégante tout en utilisant le Contrôle.BeginInvoke/EndInvoke. Donc, je mets le drapeau booléen sur le thread d'INTERFACE utilisateur et d'avoir délégué à être exécutée de manière asynchrone vérifier que le drapeau à intervalles réguliers tandis que c'est l'exécution.
Toutefois, vous pouvez vérifier en utilisant l'arrière-plan de threads de travail.
Il y a certainement d'autres solutions, mais je ne sais pas que je voudrais appeler "élégant".
on pourrait appeler l'Abandon ou l'Interruption sur le fil, mais ceux-ci peuvent avoir certains effets secondaires négatifs. Personnellement, pour quelque chose comme ça, je préfère utiliser BackgroundWorker si possible. Il a une fonction Annuler, mais c'est similaire à ce que vous avez mentionné - bool drapeau dans la classe que vous devez vérifier périodiquement dans l'exécution de code (au moins ce n'est pas un indicateur global). Ce post sur l'arrêt des threads .NET est un peu vieux mais va sur certains des pièges les autres options je l'ai mentionné ci-dessus.