【问题标题】:CancellationTokenSource vs. volatile booleanCancellationTokenSource 与 volatile 布尔值
【发布时间】:2015-05-04 07:41:01
【问题描述】:

使用CancellationTokenSource 而非volatile 布尔字段来指示Task 完成有什么好处吗?

【问题讨论】:

  • A CancellationToken 并不是要通知线程完成,而是要告诉 Task 取消它的操作。如果您希望 Task 返回,只需使用 return 语句。
  • 由于有大量标准 C# 线程类(包括 Task)在其接口中使用 CancellationTokenSource,因此您应该使用它。
  • @YuvalItzchakov 如果我没记错的话,我仍然需要在使用 CancelationTokeSource 时处理我的任务完成方式(即返回或中断)
  • CancellationToken 是将Task 转换为Canceled 状态的唯一方法。返回 bool 会将其转换为 Completed 状态
  • @YuvalItzchakov 好吧,你可以 throw TaskCanceledException 导致这种情况发生 - 但这样做有点奇怪,因为异常不会包含有意义的 CancellationToken

标签: c# task volatile cancellationtokensource


【解决方案1】:

当然可以。有许多。我会列出几个。

  • CancellationToken 支持回调。当请求取消时,您会收到通知。
  • CancellationToken 支持 WaitHandle,您可以无限期等待或超时。
  • 您可以使用CancellationTokenSource.CancelAfter 方法安排取消CancellationToken
  • 您可以将您的CancellationToken 链接到另一个,这样当一个被取消时,另一个可以被视为已取消。
  • Task 如果您的意思是 System.Threading.Tasks.Task,则 volatile 布尔值无法将任务状态转换为已取消,但 CancellationToken 可以。

【讨论】:

  • 还有here's an interesting article from Eric Lippert 解释了为什么他认为你不应该使用volatile
  • 说的很全面,谢谢。
  • @MatthewWatson:公平地说,Eric 的主要反对意见似乎是正确使用volatile 通常非常困难,而lock 通常具有足够的性能,并且在语义上更容易理解。一个简单的volatile 标志表示任务终止,虽然由于其他原因不受欢迎,但 Eric 在他的文章中似乎并不关心。
  • MatthewWatson 的链接已过期,我在此更新链接"Atomicity, volatility and immutability are different, part three"
  • 我认为@LouisGo 响应是这里的真正答案,比答案更好。阅读答案,我想“好吧,我不在乎,我会使用 volatile。”但阅读 Eric Lippert 的博客,我认为“显然存在我不理解的复杂性。我应该改用 InterlockedCancellationToken。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2013-06-13
  • 2011-04-13
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多