39

私は再現としていくつかの簡単なコードを持っています:

var taskTest = Task.Factory.StartNew(() =>
{
    System.Threading.Thread.Sleep(5000);

}).ContinueWith((Task t) =>
{
    Console.WriteLine("ERR");
}, TaskContinuationOptions.OnlyOnFaulted);

try
{
    Task.WaitAll(taskTest);
}
catch (AggregateException ex)
{
    foreach (var e in ex.InnerExceptions)
        Console.WriteLine(e.Message + Environment.NewLine + e.StackTrace);
}

ただし、try catchブロック(AggregateException InnerExceptionsオブジェクトにあります)で予期しないTaskCanceledExceptionがスローされます。「タスクがキャンセルされました」。

なぜこの例外が発生するのですか?タスクの継続は起動せず、例外は生成されませんでしたが、待機中に集約例外が発生します。

誰かがこれが私にとってどのように理にかなっているのか説明できることを願っています:)

4

1 に答える 1

55

OnlyOnFaultedの継続を伴うタスクを待機していません-その継続を待機ています(によって返されContinueWithます)。元のタスクが正常に戻ったため、継続が起動することはなく、キャンセルされたかのように動作します。

私には理にかなっています。

タスクを作成し、継続を追加したいと思いますが、元のタスクを待ちます。

var taskTest = Task.Factory.StartNew(() =>
{
    System.Threading.Thread.Sleep(5000);

});
taskTest.ContinueWith((Task t) =>
{
    Console.WriteLine("ERR");
}, TaskContinuationOptions.OnlyOnFaulted);
于 2011-07-04T16:05:16.287 に答える