6 votes

Quel est l'intérêt de passer CancellationToken à Task.Factory.StartNew() ?

Dans le code suivant, un CancellationToken est transmise à l'outil .StartNew(,) en tant que 2e paramètre, mais elle n'est utilisable que par la méthode Action via la fermeture dans le lambda. Quel est donc l'intérêt de faire passer le jeton par la fonction .StartNew(,) 2ème paramètre de la méthode ?

var cts = new CancellationTokenSource();
var token = cts.Token;
Task.Factory.StartNew(() => 
{
    while (true)
    {
        // simulate doing something useful
        Thread.Sleep(100);
    }
}, token);

4voto

VMAtm Points 8401

StartNew planifie une tâche dans le pool de threads, mais il n'est pas nécessaire de la lancer tout de suite, car des threads peuvent être indisponibles. Pendant l'attente du démarrage, une demande d'annulation peut survenir, après quoi le pool de threads ne démarrera pas de tâche du tout. Une fois la tâche lancée, c'est à vous de gérer l'annulation de la tâche.

4voto

Haukinger Points 4443

En fait, l'objectif de la CancellationToken transmis à Task.Run y Taskfactory.StartNew est de permettre à la tâche de différencier annulé par une exception lancée par CancellationToken.ThrowIfCancellationRequested y à défaut en raison d'une autre exception.

En d'autres termes, si le CancellationToken transmis lors des lancers de départ, l'état de la tâche est Cancelled tandis que toute autre exception (même provenant d'un autre CancellationToken ) le fixera à Faulted .

De même, si le CancellationToken est annulé avant la tâche démarre réellement, elle ne sera pas démarrée du tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X