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
- 使用
CancellationToken
允许令牌处理所有必要的同步,因此您不必考虑它。 - 当由于其创建中使用的令牌被标记为已取消而导致
Task
故障时,它会将Task
的状态设置为已取消,而不是出现故障。 如果使用布尔值(并且不抛出),则任务实际上将被标记为已成功完成,即使它实际已被取消。 - 与布尔值不同,它是引用类型,因此对CTS的引用可以从其他位置传递和取消(或检查)。 这是关键,因为这些位置不需要像使用布尔字段那样耦合在一起; 决定何时取消操作的代码,以及对取消作出反应的任何代码,都不需要彼此了解。 这允许更大的模块化,抽象,更高级别的function,而不是针对个别情况,等等。
- 它为代码增加了增强的语义含义。
- .NET中的“,”(逗号)和“。”(点)的KeyCode是什么?
- 获取WPF Listview以使用数据绑定显示ObservableCollection
- 当货币值为0.00美元时,C#创建自定义NumberFormatInfo以显示“Free”
- 如何有效地从List 中删除(C#)?
- entity framework – 插入具有多个模型和数据库的实体
- 如何批量使用BlockingCollection
- 来自asp.net 2.0的REST
- 寻找WCF basicHttpBinding https教程或样本
- TeamCity中的MSBuild步骤考虑了app.config而不是ASP.NET WEB API项目的web.config,导致警告MSB3247