CancellationTokenSource与手动结束Task的区别

3

假设我创建了一个任务

bool aBoolean = true;

Task.Factory.StartNew(() =>
    while(aBooloean)    {
       ...
    }
}

使用全局布尔变量来退出任务是否更好?还是使用CancellationTokenSource更好?

何时使用CancellationTokenSource来结束任务?

使用CancellationTokenSource会在何时抛出异常并导致不一致状态?

谢谢

1个回答

3

拥有一个“全局”布尔值的风险在于它可能会被优化或缓存在CPU缓存中,您可能看不到值的变化。 CancellationTokenSource 是取消 Task推荐方法。 任务使用令牌来测试是否请求取消,并从任务的Action委托简单地返回。 如果您不想抛出异常,则无需这样做。


我不知道,如果我设置全局布尔值,它最终会接收到更改吗?还是更改只会因为在缓存中而被延迟? - TheWommies
1
它取决于几种情况; 有时候永远不会。只要声明为volatile或使用Thread.VolatileWriteThread.VolatileRead,就可以像这样使用布尔字段。 CancelationTokenSource的其中一个好处是它与特定实现分离。因此,您可以在多个任务之间共享标记,而无需编写任何其他支持取消标记的代码,这对于同时在多个类之间执行任务非常有用。 - Peter Ritchie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接