任务并行库WaitAll异常处理

时间:2012-07-24 01:53:14

标签: 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. 

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

我知道有一些功能,例如取消令牌和取消源,以便能够处理某些事件,但它们似乎不允许我做我想要的。虽然它不存在,但我会喜欢在诸如task.OnException或task.OnError等任务上订阅事件处理程序之类的功能。使用TPL完成此功能有哪些选择?

2 个答案:

答案 0 :(得分:2)

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

Task.Exception Property

如果有一个未处理的异常运行Task,Task.Exception将不为null,它将是一个System.AggregateException,它将包含发生的一个或多个异常的详细信息。

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

答案 1 :(得分:0)

您可以在TaskCompletionSource的帮助下将Task执行更多地分解为多个部分。然后,您可以公开将在TaskCompletionSource SetResultTryToSetException方法运行之前引发的事件(?)。