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
CancellationToken
permet au jeton de gérer toute la synchronisation nécessaire, de sorte que vous n’avez pas à y penser. 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.