2011-09-27 1 views
0

J'ai un thread principal qui démarre une tâche mais n'attend pas son achèvement. J'ai également un bouton d'annulation sur l'interface utilisateur, sur le clic duquel je voudrais annuler la tâche. J'ai essayé de le faire à plusieurs endroits dans la méthode de la tâche:Annulation d'une tâche à la fermeture du thread principal

if (cancelToken.IsCancellationRequested) 
       { 
        return; 
       } 

Ceci, cependant, ne semble pas fonctionner de la manière souhaitée. Plus tôt, j'ai pensé faire cancelToken.ThrowIfCancellationRequested() mais pour autant que je comprenne, cela soulève une exception, et je n'ai pas de place dans le thread principal pour attraper ceci. Quel serait le meilleur moyen d'annuler la tâche dans ce scénario?

+0

Montrez-nous le code de votre tâche –

Répondre

2

Votre cancelToken provient vraisemblablement d'un CancellationTokenSource auquel le thread principal a toujours accès. Vous devriez simplement pouvoir appeler:

cancellationTokenSource.Cancel(); 

dans le gestionnaire d'événement de clic de votre bouton d'annulation.

ThrowIfCancellationRequested lèvera une exception dans le thread de tâche, pas dans le thread principal. Vous ne verriez qu'une exception dans le thread principal si vous avez appelé ThrowIfCancellationRequested et avez puis demandé le Result dans le thread principal.

Notez que si vous venez de rentrer après que l'annulation a été demandée, l'état de votre tâche se terminera par RanToCompletion au lieu de Canceled. L'appel ThrowIfCancellationRequested est le moyen préféré d'indiquer l'annulation, en partie parce que si vous avez une pile profonde dans le code de votre tâche, vous n'avez pas besoin de vous inquiéter de revenir explicitement de chaque méthode. Je ne suis pas sûr si l'annulation représente une faute qui doit être observée, d'ailleurs - je pas pas, mais vous devriez probablement vérifier. (Vous devriez probablement avoir une continuation pour traiter les erreurs de toute façon ...)

+1

J'ajouterais aussi que toutes les tâches ContinueWith (TaskContinuationOptions.OnlyOnCanceled) s'attendent à ce qu'une exception soit levée afin de " Feu". –

Questions connexes