【问题标题】:Does ContinueWhenAll observe the exceptions and hence prevent an UnobservedTaskException?ContinueWhenAll 是否观察到异常并因此防止出现 UnobservedTaskException?
【发布时间】:2012-11-29 19:47:23
【问题描述】:

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

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

【问题讨论】:

    标签: c# task-parallel-library unobserved-exception


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • ContinueWhenAny 只会在 first 任务上执行(根据 msdn 上的文档/示例:msdn.microsoft.com/en-us/library/dd321530.aspx,并注意它只返回一个任务,不是一系列任务),所以这不是一个好的解决方案。
      • 非常真实!我已经更新了我的答案。 TaskScheduler.UnobservedTaskException 是首选解决方案。
      • 谢谢!这很有用,我最终使用了马特的方法,所以我将其标记为答案。
      猜你喜欢
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 2020-09-13
      • 2019-09-09
      • 2010-10-22
      • 1970-01-01
      相关资源
      最近更新 更多