假设我创建了一个任务
bool aBoolean = true;
Task.Factory.StartNew(() =>
while(aBooloean) {
...
}
}
使用全局布尔变量来退出任务是否更好?还是使用CancellationTokenSource更好?
何时使用CancellationTokenSource来结束任务?
使用CancellationTokenSource会在何时抛出异常并导致不一致状态?
谢谢
假设我创建了一个任务
bool aBoolean = true;
Task.Factory.StartNew(() =>
while(aBooloean) {
...
}
}
使用全局布尔变量来退出任务是否更好?还是使用CancellationTokenSource更好?
何时使用CancellationTokenSource来结束任务?
使用CancellationTokenSource会在何时抛出异常并导致不一致状态?
谢谢
拥有一个“全局”布尔值的风险在于它可能会被优化或缓存在CPU缓存中,您可能看不到值的变化。 CancellationTokenSource
是取消 Task
的推荐方法。 任务使用令牌来测试是否请求取消,并从任务的Action委托简单地返回。 如果您不想抛出异常,则无需这样做。
volatile
或使用Thread.VolatileWrite
和Thread.VolatileRead
,就可以像这样使用布尔字段。CancelationTokenSource
的其中一个好处是它与特定实现分离。因此,您可以在多个任务之间共享标记,而无需编写任何其他支持取消标记的代码,这对于同时在多个类之间执行任务非常有用。 - Peter Ritchie