Certains System.Threading.Tasks.Task
constructeurs prennent un CancellationToken
comme paramètre:
CancellationTokenSource source = new CancellationTokenSource();
Task t = new Task (/* method */, source.Token);
Ce qui me déroute à ce sujet, c'est qu'il n'y a aucun moyen de l' intérieur du corps de la méthode pour réellement accéder au jeton transmis (par exemple, rien de tel Task.CurrentTask.CancellationToken
). Le jeton doit être fourni via un autre mécanisme, tel que l'objet d'état ou capturé dans un lambda.
Alors, à quoi sert le jeton d'annulation dans le constructeur?
Parallel.For
ouParallel.ForEach
Le constructeur utilise le jeton pour la gestion des annulations en interne. Si votre code souhaite accéder au jeton, vous êtes responsable de vous le transmettre. Je recommande fortement de lire le livre sur la programmation parallèle avec Microsoft .NET sur CodePlex .
Exemple d'utilisation de CTS du livre:
la source
token.ThrowIfCancellationRequested();
? Dans mon test, le comportement est le même. Des idées?when cts.Cancel() is called the Task is going to get canceled and end, no matter what you do
. Si la tâche est annulée avant d'avoir démarré, elle est annulée . Si le corps de la tâche ne vérifie simplement aucun jeton, il s'exécutera jusqu'à son terme, ce qui entraînera un état RanToCompletion . Si le corps lance unOperationCancelledException
, par exemple parThrowIfCancellationRequested
, alors la tâche vérifiera si le jeton d'annulation de cette exception est le même que celui associé à la tâche. Si c'est le cas, la tâche est annulée . Sinon, c'est défectueux .L'annulation n'est pas un cas simple comme beaucoup pourraient le penser. Certaines des subtilités sont expliquées dans cet article de blog sur msdn:
Par exemple:
Annulation dans les extensions parallèles
la source
Voici un exemple qui illustre les deux points de la réponse de Max Galkin :
Production:
la source