2

我正在使用任务并行库,并且正在使用任务工厂来创建和启动新任务列表。启动任务后,我调用 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 完成此功能有哪些选择?

4

2 回答 2

2

After a Task has finished running, you can check the Task.Exception property.

Task.Exception Property

If there was an unhandled exception running the Task, Task.Exception will not be null, it will be a System.AggregateException which will contain the details for one of more exceptions that occured.

You might also try using Task.ContinueWith on each Task, passing in a new Task and a flag of TaskContinuationOptions.OnlyOnFaulted. This new task is executed only if there was an unhandled exception in the original Task.

于 2012-07-24T02:37:56.647 回答
0

您可以在TaskCompletionSourceTask的帮助下将执行进一步分解。然后,您可以公开将在will或方法运行之前引发的事件 (?) 。TaskCompletionSourceSetResultTryToSetException

于 2012-07-29T07:33:33.140 回答