[英]Why is the TaskScheduler.UnobservedTaskException does not trigger?
[英]Does ContinueWhenAll observe the exceptions and hence prevent an UnobservedTaskException?
假设我有一个任务数组taskArray
并且我使用ContinueWhenAll
创建了一个任务延续,并且taskArray
一个或多个任务抛出了一些异常。 我的问题是,是否有任何可能导致UnobservedTaskException
?
所以基本上问题归结为, ContinueWhenAll
是否会像Wait
那样观察taskArray
的异常? 如果不是,那么如果我不想明确查看每个任务的异常,应该将什么用于一组任务。 我不想使用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
之前触发。 在这里您可以观察异常。
TaskScheduler.UnobservedTaskException += (sender, e) =>
{
e.SetObserved();
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.