给出以下代码:
// 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
的结果,HandleErrors
在SecondAsyncMethod
之前被调用,这显然是一个问题。
有没有办法将TaskContinuationOptions
应用于ContinueWith
,以便它只可能跳过该步骤,而不是后续步骤?
答案 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);