【问题标题】:Task Parallel Library WaitAll Exception Handling任务并行库 WaitAll 异常处理
【发布时间】:2012-07-24 01:53:13
【问题描述】:

我正在使用任务并行库,并且正在使用任务工厂来创建和启动新任务列表。启动任务后,我调用 Task.WaitAll(...) 等待所有任务返回。代码如下所示。

Tasks<MyClass>[] tasks = .../Create List of Tasks and Start using TaskFactory.StartNew(..) etc.

Task.WaitAll(tasks);         //Wait until all tasks complete before continuing. 

当我的任务返回并完成时,如果它们满足某些条件,结果将被汇总到一个列表中以供稍后处理。在每个任务运行时,可能会引发某些异常,这将“取消”任务结果被添加到聚合列表的资格。我希望能够在执行任务中抛出异常,并且该任务不再运行。

我知道有一些功能可以处理某些事件,例如取消令牌和取消源,但它们似乎不允许我做我想做的事。尽管它不存在,但我希望能够订阅诸如 task.OnException 或 task.OnError 等任务上的事件处理程序之类的功能。使用 TPL 完成此功能有哪些选择?

【问题讨论】:

    标签: c# .net multithreading task-parallel-library


    【解决方案1】:

    任务完成运行后,您可以检查 Task.Exception 属性。

    Task.Exception Property

    如果运行任务时出现未处理的异常,Task.Exception 不会为空,它将是 System.AggregateException,其中包含发生的多个异常之一的详细信息。

    您也可以尝试在每个任务上使用 Task.ContinueWith,传入一个新任务和一个 TaskContinuationOptions.OnlyOnFaulted 标志。仅当原始任务中存在未处理的异常时,才会执行此新任务。

    【讨论】:

    • 另外,请注意,如果您使用WaitAll() 并且某些Tasks 抛出异常,WaitAll() 本身将抛出一个AggregateException,其中将包含所有抛出的异常。
    【解决方案2】:

    TaskCompletionSource 的帮助下,您可以将Task 执行进一步分解为多个部分。然后,您可以公开将在 TaskCompletionSource 将在 SetResultTryToSetException 方法运行之前引发的事件 (?)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 2018-07-19
      • 2014-03-06
      相关资源
      最近更新 更多