我想知道如何使用 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
或 false
.
我要么遗漏了一些非常简单的东西,要么文档有问题。无论哪种方式,我都非常困惑。我的最终目标是能够等待多个任务完成或优雅地取消它们(通过正确使用 CancellationToken
),如果它们没有在一定时间内完成。
这与我的帖子有关here ,但是这一次,我正在编写异步代码并且可以观察取消标记。
最佳答案
Since Task.WaitAll is a blocking operation, how could you possibly "observe" it during that operation?
你不是观察它的人;这是
Task.WaitAll
方法。Furthermore, it says "The cancellationToken argument is used to cancel the wait operation. If it is canceled, the Wait returns false." but then it also says elsewhere that a OperationCanceledException is thrown when the CancellationToken is cancelled, meaning Task.WaitAll doesn't return true or false.
这似乎是文档中的错误。如果在任务完成或等待被取消之前指定的超时已过,则返回 false。
Who cancels it?
通常,一些代码在另一个线程上运行,因为当前线程已经忙于等待任务完成。或者您可以调用
CancellationTokenSource.CancelAfter
指定取消 token 的超时时间。
关于.net - 如何将 CancellationToken 与 Tasks.WaitAll() 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28193302/