.net 将TaskContinuationOptions应用于;“步骤”;而不是整个链条

.net 将TaskContinuationOptions应用于;“步骤”;而不是整个链条,.net,task-parallel-library,.net,Task Parallel Library,给定以下代码: // TCO = TaskContinuationOptions FirstAsyncMethod() .ContinueWith(t => SecondAsyncMethod(t.Result), TCO.OnlyOnRanToCompletion) .ContinueWith(t => HandleErrors(t)); 如果我按原样执行,并且FirstAsyncMethod抛出异常,HandleErrors永远不会被调用,因为SecondAsy

给定以下代码:

// TCO = TaskContinuationOptions
FirstAsyncMethod()
    .ContinueWith(t => SecondAsyncMethod(t.Result), TCO.OnlyOnRanToCompletion)
    .ContinueWith(t => HandleErrors(t));
如果我按原样执行,并且
FirstAsyncMethod
抛出异常,
HandleErrors
永远不会被调用,因为
SecondAsyncMethod
上的
TaskContinuationOptions
会停止整个链

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

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


有没有一种方法可以将
TaskContinuationOptions
应用到
continuationwith
中,这样它就只可能跳过该步骤,而不会跳过任何后续步骤?

我通过将我的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);

您是否考虑过使用
Handle()
flatte()
来摆脱“荒谬的层次结构”?谢谢。我在寻找
展开时,没有发现
展开
。至少我可以删除我的扩展方法:)@RichardSzalay你最终做了什么来解决这个问题?我面临着完全相同的事情。看起来我可能必须去掉“OnlyOnRanToCompletion”选项,并在第一个ContinueWith块中插入逻辑,以便在出现错误时跳过“secondasynchmethod”。您的
ContinueWith
on
task2
将永远不会触发,由于task2仅在运行时使用
如果故障发生在task2而不是task1中,则会使用该选项。i、 e.任务1完成得很好,但任务2失败了。通过将错误处理任务添加到两个步骤中,无论在何处出现故障,仍将调用错误处理。或者,您是否尝试链接,以便在task1出现故障时运行一些处理,但仍将调用task2?