繁体   English   中英

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

[英]Does ContinueWhenAll observe the exceptions and hence prevent an UnobservedTaskException?

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

所以基本上问题归结为, ContinueWhenAll是否会像Wait那样观察taskArray的异常? 如果不是,那么如果我不想明确查看每个任务的异常,应该将什么用于一组任务。 我不想使用WaitAll因为它不适用于通用任务。

如果从应用程序范围的任务中捕获异常是可以接受的,则 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]; });

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM