假设我有一组任务说taskArray
,我使用ContinueWhenAll
创建任务延续,taskArray
中的一个或多个任务抛出一些异常。我的问题是,是否有任何情况可能会导致UnobservedTaskException
?
所以基本上问题归结为,ContinueWhenAll
是否会taskArray
{{1}}中的例外{{1}}会针对单个任务进行检查?如果不是,那么如果我不想明确查看每个任务的异常,那么应该对一组任务使用什么。我不想使用Wait
,因为它不适用于通用任务。
答案 0 :(得分:2)
如果没有,那么你必须做你不想做的事(以某种方式观察异常)。您有两种选择:
OnlyOnFaulted
案例中运行的每个任务创建一个续集,其唯一的工作是通过查看任务上的Exception
属性来观察异常。在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();
};