c# - 任务并行库WaitAll异常处理

标签 c# .net multithreading task-parallel-library

我正在使用任务并行库,并使用任务工厂来创建和启动新任务列表。启动任务后,我调用 Task.WaitAll(...) 等待所有任务返回。该代码类似于以下内容。

Tasks<MyClass>[] tasks = .../Create List of Tasks and Start using TaskFactory.StartNew(..) etc.

Task.WaitAll(tasks);         //Wait until all tasks complete before continuing. 

当我的任务返回并完成时,如果它们满足某些条件,结果将被聚合到一个列表中以便稍后处理。当每个任务运行时,可能会抛出某些异常,这将使任务结果“取消”添加到聚合列表的资格。我希望能够在执行任务中抛出异常,并且任务不再运行。

我知道有取消 token 和取消源等功能可以处理某些事件,但它们似乎不允许我做我想做的事情。尽管它不存在,但我希望有一些功能,例如订阅任务上的事件处理程序,例如task.OnException或task.OnError等。使用 TPL 实现此功能有哪些选项?

最佳答案

任务运行完成后,您可以检查 Task.Exception 属性。

Task.Exception Property

如果运行任务时出现未处理的异常,Task.Exception 将不会为 null,它将是一个 System.AggregateException,其中将包含发生的多个异常之一的详细信息。

您还可以尝试对每个任务使用 Task.ContinueWith,传入新任务和 TaskContinuationOptions.OnlyOnFaulted 标志。仅当原始任务中存在未处理的异常时,才会执行此新任务。

关于c# - 任务并行库WaitAll异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11623036/

相关文章:

c# - 为什么C#中没有const成员方法和const参数?

Java:如何使用 synchronized 和 volatile

c# - 使用 NServicebus 实现 Autofac 的先有鸡还是先有蛋问题

java - 为什么ArrayBlockingQueue中两个线程可以获取带条件的ReentrantLock

c++ - lock_guard 是否保护返回值?

c# - 为什么来自 SerialPort 的文本会分成几个部分?

c# - 在 ASP.NET 中,对预检请求的响应未通过访问控制检查 : No 'Access-Control-Allow-Origin' header

c# - WCF 服务未反序列化枚举值

c# - Entity Framework 6 : Multicolumn unique index featuring navigation property

.net - GroupBy 来自日期时间变量的日期