CancellationTokenSource vs. volatile boolean

Yoa*_*oav 16 c# volatile task cancellationtokensource

在一个 易变的布尔字段上使用CancellationTokenSource来表示完成信号是否有任何好处?Task

Sri*_*vel 21

当然是的.有许多.我列举的很少.

  • CancellationToken支持回调.您可以在要求取消时收到通知.
  • CancellationToken支持WaitHandle您可以等待无限期或超时.
  • 您可以安排取消CancellationToken使用CancellationTokenSource.CancelAfter方法.
  • 您可以将自己链接CancellationToken到另一个,这样当一个被取消时,另一个可以被视为已取消.
  • 通过Task你的意思System.Threading.Tasks.Task挥发性布尔不能转换任务的状态取消,但CancellationToken可以.

  • @MatthewWatson:公平地说,Eric的主要反对意见似乎是通常很难正确使用`volatile`,并且`lock`通常具有足够的性能,并且在语义上更容易理解.一个简单的`volatile`标志表示任务的终止,虽然出于其他原因而不受欢迎,但这并不是Eric在他的文章中所关注的. (7认同)
  • MatthewWatson 的链接已过时,我在这里更新链接 [“原子性、波动性和不变性是不同的,第三部分”](https://ericlippert.com/2011/06/16/atomicity-volatility-and-immutability-are- Different -第三部分/) (2认同)