.net - 如何将 CancellationToken 与 Tasks.WaitAll() 一起使用

标签 .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不返回 truefalse .

我要么遗漏了一些非常简单的东西,要么文档有问题。无论哪种方式,我都非常困惑。我的最终目标是能够等待多个任务完成或优雅地取消它们(通过正确使用 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/

相关文章:

c# - 从 C# 4.0 中的元组列表中查找和删除元组

.net - 你如何从 javascript 引发服务器端事件?

c# - 为什么 .net 使用 JIT 编译器而不是只在目标机器上编译一次代码?

javascript - 链接到模板的 polymer 非阻塞异步函数

c# - 异步和同步方法

c# - 为什么一路往下用Async/await

c# - 将命令行参数传递给我的应用程序的已运行实例

node.js - Node js 应用程序中数据库连接池处理的最佳实践?

javascript - 为什么 setTimeout 会阻止我的 Node.js 应用程序?

c# - 为什么新线程可以访问UI?