web-dev-qa-db-fra.com

Comment annuler un AnnulationToken

Je commence une tâche, qui démarre d'autres tâches et ainsi de suite.
Étant donné cet arbre, si une tâche échoue, le résultat de toute l'opération est inutile. J'envisage d'utiliser des jetons d'annulation. À ma grande surprise, le jeton n'a pas de méthode "CancelThisToken ()" ...

Donc ma question est: comment puis-je, en possession de [~ # ~] seulement [~ # ~] a CancellationToken , annule ça?

33
Leonardo

Comme l'indiquent les documents, vous devez appeler la méthode d'annulation à partir de l'objet source. Un exemple de code est inclus dans le lien que vous avez fourni. Voici les sections pertinentes:

// Define the cancellation token.
CancellationTokenSource source = new CancellationTokenSource();
previouslyProvidedToken = source.Token;
...
source.Cancel();

https://msdn.Microsoft.com/en-us/library/system.threading.cancellationtoken (v = vs.110) .aspx

comment puis-je, en possession d'un SEUL CancellationToken, l'annuler?

Sans référence à la source, vous ne pouvez pas annuler un jeton. Cela ne signifie pas que vous avez besoin du CancellationTokenSource qui a généré le premier le jeton. Lorsque vous recevez un jeton, vous pouvez créer une nouvelle instance de source de jeton attribuer son jeton au jeton fourni et l'annuler. Toutes les autres parties qui peuvent lire ce jeton verront que son annulation a été demandée.

59
RyanS

Comme extension des réponses fournies jusqu'à présent, si vous voulez avoir à la fois une instance de CancellationToken fournie à vos méthodes, et annulez en interne , vous devez examiner CancellationTokenSource.CreateLinkedTokenSource . En substance, cela annulera soit lorsque cts.Cancel() est appelée, soit l'un de ses jetons fournis.

7
Daniel Park

Générez des instances CancellationToken à partir d'une instance CancellationTokenSource et appelez Cancel sur l'instance CTS.

Exemple: https://msdn.Microsoft.com/en-us/library/dd321955 (v = vs.110) .aspx

Il existe également un moyen d'annuler gracieusement les threads sans qu'ils ne déclenchent d'exceptions, vérifiez simplement le CT pour IsCancellationRequested et gérez le cas vous-même. Plus d'informations: tilisation de la propriété IsCancellationRequested?

0
Machinarius