我正在使用任务并行库,我正在使用任务工厂来创建和启动新任务列表。启动任务后,我调用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完成此功能有哪些选择?
答案 0 :(得分:2)
任务完成后,您可以检查Task.Exception属性。
如果有一个未处理的异常运行Task,Task.Exception将不为null,它将是一个System.AggregateException,它将包含发生的一个或多个异常的详细信息。
您也可以尝试在每个Task上使用Task.ContinueWith,传入一个新的Task和一个TaskContinuationOptions.OnlyOnFaulted的标志。仅当原始任务中存在未处理的异常时,才会执行此新任务。
答案 1 :(得分:0)
您可以在TaskCompletionSource的帮助下将Task
执行更多地分解为多个部分。然后,您可以公开将在TaskCompletionSource
SetResult
或TryToSetException
方法运行之前引发的事件(?)。