1

親/子タスクの階層があります。

var t1 = Task.Factory.StartNew(() =>
    {
        var t21 = Task.Factory.StartNew(() =>
            {
                throw new Exception("Inner fault");
            }, TaskCreationOptions.AttachedToParent);

        var t22 = t21.ContinueWith(ant =>
            {
                Console.WriteLine("Inner handler: " + ant.Exception.InnerException.Message);
            }, TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.OnlyOnFaulted);

        throw new Exception("Outer fault");
    });

try
{
    t1.Wait();
}
catch (AggregateException ae)
{
    foreach (var e in ae.Flatten().InnerExceptions)
        Console.WriteLine("Outer handler: " + e.Message);
}

その結果、「外部ハンドラー」は、「内部ハンドラー」によって既に処理された例外を処理します。

Inner handler: Inner fault
Outer handler: Outer fault
Outer handler: Inner fault

「外部ハンドル」(私の例では「内部ハンドラ」) で既に処理された例外の処理を防ぐことは可能ですか?

4

1 に答える 1

1

で削除すると機能TaskCreationOptions.AttachedToParentt21ます。

その場合、アタッチされた子タスクの動作を再現するために追加t22.Wait()することができます。t1

于 2013-09-04T11:39:51.357 に答える