3

次のコードがあるとします。

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

そのまま実行してFirstAsyncMethod例外をスローすると、 onがチェーン全体を停止するHandleErrorsため、呼び出されることはありません。TaskContinuationOptionsSecondAsyncMethod

一方、 on を削除するTaskContinuationOptionsSecondAsyncMethod、アクセスするTask.Result元の AggregateException の InnerException としてAggregateExceptionスローされます。私の実際のコードでは、これによりアンラップする必要のあるばかげた階層が生成されます。

の結果をキャプチャ (つまりチェーン) しませんがContinueWith、明らかに問題にHandleErrorsなる前に呼び出されます。SecondAsyncMethod

a に適用TaskContinuationOptionsして、ContinueWithそのステップのみを潜在的にスキップし、後続のステップをスキップする方法はありますか?

4

1 に答える 1

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);
于 2013-01-17T03:53:58.910 に答える