Différence entre CancellationTokenSource et l’indicateur de sortie pour la sortie d’une boucle de tâches

Je me demandais s’il y avait une différence entre la tâche de boucle de fin avec CancellationTokenSource et l’indicateur de sortie

AnnulationTokenSource:

CancellationTokenSource cancellationTokenSource; Task loopTask; void StartLoop() { cancellationTokenSource = new CancellationTokenSource(); loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning); } void Loop() { while (true) { if (cancellationTokenSource.IsCancellationRequested) break; Thread.Yield(); } } void StopLoop() { cancellationTokenSource.Cancel(); loopTask = null; cancellationTokenSource = null; } 

Drapeau de sortie:

 volatile bool exitLoop; Task loopTask; void StartLoop() { exitLoop = false; loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning); } void Loop() { while (true) { if (exitLoop) break; Thread.Yield(); } } void StopLoop() { exitLoop = true; loopTask = null; } 

Pour moi, il n’est pas inutile d’utiliser CancellationTokenSource, mais y at-il une raison pour laquelle le jeton d’annulation peut être ajouté en tant que paramètre à la fabrique de tâches?

Merci beaucoup pour tout type de réponse.

Meilleur équipe de ragards

  1. L’utilisation d’un CancellationToken permet au jeton de gérer toute la synchronisation nécessaire, de sorte que vous n’avez pas à y penser.
  2. Lorsqu’une Task défaillante à cause du jeton utilisé dans sa création et qu’elle est marquée comme annulée, elle définit l’état de la Task sur annulé plutôt que sur faute. Si vous utilisez un booléen (et ne lancez pas), la tâche sera en réalité marquée comme terminée, même si elle a été annulée.
  3. Contrairement à un booléen, il s’agit d’un type de référence. Ainsi, la référence au CTS peut être transmise et annulée (ou inspectée) depuis d’autres emplacements. Il est essentiel que ces sites ne doivent pas être couplés comme ils le feraient si vous utilisiez un champ booléen. ni le code décidant quand l’opération est annulée, ni aucun des codes réagissant à l’annulation, n’ont besoin de se connaître. Cela permet une plus grande modularisation, une plus grande abstraction, des niveaux de fonctionnalité plus élevés non spécifiques à des circonstances individuelles, etc.
  4. Il ajoute une signification sémantique améliorée au code.