【问题标题】:CancellationTokenSource vs manually ending TaskCancellationTokenSource vs 手动结束任务
【发布时间】:2012-08-14 04:24:06
【问题描述】:

假设我创建了一个任务

bool aBoolean = true;

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

使用全局布尔值退出任务是否更好?

还是使用 CancellationTokenSource 更好?

什么时候适合使用 CancellationTokenSource 结束任务?

当您使用 CancellationTokenSource 并让事情处于不一致状态时,它是否只是抛出异常?

谢谢

【问题讨论】:

    标签: task cancellationtokensource


    【解决方案1】:

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

    【讨论】:

    • 我不知道,所以如果我设置全局布尔值,它最终会接受变化吗?或者更改是否会因为它在缓存中而被延迟?
    • 这取决于几种情况;有时从来没有。您可以使用这样的布尔字段,只要您声明它volatile 或使用Thread.VolatileWriteThread.VolatileReadCancelationTokenSource 的好处之一是它与特定的实现分离。因此,您可以在您尚未编写的多个任务或支持取消令牌的任何其他代码之间共享一个令牌。如果您要跨多个类并行执行任务,这将非常有用。
    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多