CancellationTokenSource与Task循环退出的退出标志之间的区别

我想知道结束循环任务与CancellationTokenSource和退出标志之间是否有任何区别

CancellationTokenSource:

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; } 

退出标志:

 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; } 

对我来说,使用CancellationTokenSource没有任何意义,顺便说一下,为什么取消令牌可以作为参数添加到任务工厂?

非常感谢您的任何答案。

最好的ragards teamol

  1. 使用CancellationToken允许令牌处理所有必要的同步,因此您不必考虑它。
  2. 当由于其创建中使用的令牌被标记为已取消而导致Task故障时,它会将Task的状态设置为已取消,而不是出现故障。 如果使用布尔值(并且不抛出),则任务实际上将被标记为已成功完成,即使它实际已被取消。
  3. 与布尔值不同,它是引用类型,因此对CTS的引用可以从其他位置传递和取消(或检查)。 这是关键,因为这些位置不需要像使用布尔字段那样耦合在一起; 决定何时取消操作的代码,以及对取消作出反应的任何代码,都不需要彼此了解。 这允许更大的模块化,抽象,更高级别的function,而不是针对个别情况,等等。
  4. 它为代码增加了增强的语义含义。