3

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

所以基本上问题归结为,是否观察到单个任务的ContinueWhenAll异常?如果不是,那么如果我不想明确查看每个任务的异常,那么应该为一组任务使用什么。我不想使用它,因为它不适用于一般任务。taskArrayWaitWaitAll

4

2 回答 2

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];
        });
    
于 2012-11-30T14:35:29.230 回答
1

不,ContinueWhenAll不会观察到您的任务中抛出的任何异常。

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

TaskScheduler.UnobservedTaskException += (sender, e) =>
{
    e.SetObserved();
};
于 2012-11-30T07:20:13.650 回答