假设我有一组任务说taskArray
,并且我创建了一个任务延续ContinueWhenAll
,其中一个或多个任务taskArray
抛出了一些异常。我的问题是,是否有任何情况可能导致UnobservedTaskException
?
所以基本上问题归结为,是否观察到单个任务的ContinueWhenAll
异常?如果不是,那么如果我不想明确查看每个任务的异常,那么应该为一组任务使用什么。我不想使用它,因为它不适用于一般任务。taskArray
Wait
WaitAll
假设我有一组任务说taskArray
,并且我创建了一个任务延续ContinueWhenAll
,其中一个或多个任务taskArray
抛出了一些异常。我的问题是,是否有任何情况可能导致UnobservedTaskException
?
所以基本上问题归结为,是否观察到单个任务的ContinueWhenAll
异常?如果不是,那么如果我不想明确查看每个任务的异常,那么应该为一组任务使用什么。我不想使用它,因为它不适用于一般任务。taskArray
Wait
WaitAll
如果从任务应用程序范围内捕获异常是可以接受的,那么 davenewza 的回答就足够了。
如果不是,那么您必须做您不想做的事情(以某种方式观察异常)。你有两个选择:
OnlyOnFaulted
来观察异常的情况下运行的每个任务创建一个延续。Exception
在 ContinueWhenAll 的延续中,您可以将任务分为有异常和没有异常的任务:
Task.Factory.ContinueWhenAll(tasks, ts =>
{
var lookup = ts.ToLookup(t => t.Exception != null);
var faultedTasks = lookup[true];
var nonFaultedTasks = lookup[false];
});
不,ContinueWhenAll
不会观察到您的任务中抛出的任何异常。
您可以使用该事件“捕获”并观察可能在您的任何任务中发生的任何异常TaskScheduler.UnobservedTaskException
。UnobservedTaskException
这会在终结器线程抛出an 之前触发。在这里您可以观察到异常。
TaskScheduler.UnobservedTaskException += (sender, e) =>
{
e.SetObserved();
};