将TaskContinuationOptions应用于“步骤”而不是整个链

时间:2013-01-17 02:12:15

标签: .net task-parallel-library

给出以下代码:

// TCO = TaskContinuationOptions
FirstAsyncMethod()
    .ContinueWith(t => SecondAsyncMethod(t.Result), TCO.OnlyOnRanToCompletion)
    .ContinueWith(t => HandleErrors(t));

如果我按原样执行,而FirstAsyncMethod会抛出异常,则永远不会调用HandleErrors,因为TaskContinuationOptions上的SecondAsyncMethod会停止整个链。

另一方面,如果删除TaskContinuationOptions上的SecondAsyncMethod,则访问Task.Result会导致AggregateException抛出作为原始AggregateException的InnerException 。在我的实际代码中,这会产生一个需要解开的荒谬的层次结构。

我没有捕获(即。链)ContinueWith的结果,HandleErrorsSecondAsyncMethod之前被调用,这显然是一个问题。

有没有办法将TaskContinuationOptions应用于ContinueWith,以便它只可能跳过该步骤,而不是后续步骤?

1 个答案:

答案 0 :(得分:1)

我已经通过将我的HandleErrors添加到链中的所有任务来解决这个问题,但是使它们以父任务错误为条件。

Task task1 = new Task(FirstAsyncMethod());
Task task2 = task1.ContinueWith(t => SecondAsyncMethod(t.Result), TCO.OnlyOnRanToCompletion);


task1.ContinueWith(t => HandleErrors(t), TCO.OnlyOnFaulted);
task2.ContinueWith(t => HandleErrors(t), TCO.OnlyOnFaulted);