如何使用Tasks.WaitAll()使用CancellationToken

时间:2015-01-28 13:18:48

标签: .net asynchronous async-await cancellation

我想知道如何使用以Task.WaitAll为参数的CancellationToken重载,例如https://msdn.microsoft.com/en-us/library/dd321573%28v=vs.110%29.aspx

文档说CancellationToken参数是“在等待任务完成时要观察的CancellationToken。”

由于Task.WaitAll是阻塞操作,你怎么可能在那次操作中“观察”它?此外,它说“cancellationToken参数用于取消等待操作。如果取消,则Wait返回false。”但随后在其他地方也说在取消OperationCanceledException时会引发CancellationToken,这意味着Task.WaitAll不会返回true {{ 1}}。

我要么错过了一些非常简单的东西,要么是文档出了问题。无论哪种方式,我都很困惑。我的最终目标是能够等待多个任务完成或优雅地取消它们(通过正确使用false)如果它们在一段时间内没有完成。

这与我的帖子here有关,但这一次,我正在编写异步代码,可以观察取消令牌。

1 个答案:

答案 0 :(得分:4)

  

由于Task.WaitAll是一个阻塞操作,你怎么可能"观察"在那次行动中呢?

你不是观察它的人;它是Task.WaitAll方法。

  

此外,它说" cancellationToken参数用于取消等待操作。如果取消,则Wait返回false。"但是当其他地方也说取消取消取消时抛出OperationCanceledException,这意味着Task.WaitAll不会返回true或false。

这似乎是文档中的一个错误。如果在任务完成或等待被取消之前经过了指定的超时,则返回false。

  

谁取消了?

通常,某些代码在另一个线程上运行,因为当前线程已经忙于等待任务完成。或者您可以调用CancellationTokenSource.CancelAfter来指定取消令牌之后的超时。