我想知道如何使用以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有关,但这一次,我正在编写异步代码,可以观察取消令牌。
答案 0 :(得分:4)
由于Task.WaitAll是一个阻塞操作,你怎么可能"观察"在那次行动中呢?
你不是观察它的人;它是Task.WaitAll
方法。
此外,它说" cancellationToken参数用于取消等待操作。如果取消,则Wait返回false。"但是当其他地方也说取消取消取消时抛出OperationCanceledException,这意味着Task.WaitAll不会返回true或false。
这似乎是文档中的一个错误。如果在任务完成或等待被取消之前经过了指定的超时,则返回false。
谁取消了?
通常,某些代码在另一个线程上运行,因为当前线程已经忙于等待任务完成。或者您可以调用CancellationTokenSource.CancelAfter
来指定取消令牌之后的超时。