ContinueWhenAll是否会观察异常并因此阻止UnobservedTaskException?

时间:2012-11-29 19:47:23

标签: c# task-parallel-library unobserved-exception

假设我有一组任务说taskArray,我使用ContinueWhenAll创建任务延续,taskArray中的一个或多个任务抛出一些异常。我的问题是,是否有任何情况可能会导致UnobservedTaskException

所以基本上问题归结为,ContinueWhenAll是否会taskArray {{1}}中的例外{{1}}会针对单个任务进行检查?如果不是,那么如果我不想明确查看每个任务的异常,那么应该对一组任务使用什么。我不想使用Wait,因为它不适用于通用任务。

2 个答案:

答案 0 :(得分:2)

如果从应用程序范围内的任务中捕获异常,则davenewza的答案就足够了。

如果没有,那么你必须做你不想做的事(以某种方式观察异常)。您有两种选择:

  1. OnlyOnFaulted案例中运行的每个任务创建一个续集,其唯一的工作是通过查看任务上的Exception属性来观察异常。
  2. 在ContinueWhenAll的续集中,您可以将任务拆分为具有例外的任务和不包含的任务:

        Task.Factory.ContinueWhenAll(tasks, ts =>
        {
            var lookup = ts.ToLookup(t => t.Exception != null);
            var faultedTasks = lookup[true];
            var nonFaultedTasks = lookup[false];
        });
    

答案 1 :(得分:1)

不,ContinueWhenAll不会发现任务中引发的任何异常。

您可以“捕获”并观察使用TaskScheduler.UnobservedTaskException事件在您的任何任务中可能发生的任何异常。这在终结器线程抛出UnobservedTaskException之前触发。在这里你可以观察例外。

TaskScheduler.UnobservedTaskException += (sender, e) =>
{
    e.SetObserved();
};