我正在使用任务并行库,并使用任务工厂来创建和启动新任务列表。启动任务后,我调用 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.
当我的任务返回并完成时,如果它们满足某些条件,结果将被聚合到一个列表中以便稍后处理。当每个任务运行时,可能会抛出某些异常,这将使任务结果“取消”添加到聚合列表的资格。我希望能够在执行任务中抛出异常,并且任务不再运行。
我知道有取消 token 和取消源等功能可以处理某些事件,但它们似乎不允许我做我想做的事情。尽管它不存在,但我希望有一些功能,例如订阅任务上的事件处理程序,例如task.OnException或task.OnError等。使用 TPL 实现此功能有哪些选项?
最佳答案
任务运行完成后,您可以检查 Task.Exception 属性。
如果运行任务时出现未处理的异常,Task.Exception 将不会为 null,它将是一个 System.AggregateException,其中将包含发生的多个异常之一的详细信息。
您还可以尝试对每个任务使用 Task.ContinueWith,传入新任务和 TaskContinuationOptions.OnlyOnFaulted 标志。仅当原始任务中存在未处理的异常时,才会执行此新任务。
关于c# - 任务并行库WaitAll异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11623036/