等待具有OnlyOnFaulted Continuation的任务会导致AggregateException

Red*_*dth 38 c# parallel-processing task pfx task-parallel-library

我有一些简单的代码作为repro:

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);
}
Run Code Online (Sandbox Code Playgroud)

但是,我在try catch块中抛出一个意外的TaskCanceledException(它在AggregateException InnerExceptions对象中)."任务被取消了".

为什么我得到这个例外?任务的Continuation永远不会触发,它没有生成任何异常,但在等待时我仍然得到聚合异常....

我希望有人能解释一下这对我有多大意义:)

Jon*_*eet 55

你不是等待一个任务一个OnlyOnFaulted延续-你就等着这延续(由返回ContinueWith).延续永远不会触发,因为原始任务正常返回,所以它的行为就像被取消一样.

我感觉合理.

我怀疑你想创建任务,添加延续,但然后等待原始任务:

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

});
taskTest.ContinueWith((Task t) =>
{
    Console.WriteLine("ERR");
}, TaskContinuationOptions.OnlyOnFaulted);
Run Code Online (Sandbox Code Playgroud)

  • @JorgeFioranelli - 如果延续附加到已完成的任务,则如果任务以异常完成,则会立即执行.(如果任务没有错,它将取消.) (7认同)
  • 啊,好的电话......我在想,ContinueWith正在恢复原来的任务...... (4认同)
  • 不确定,但我相信任务可能会在添加延续之前抛出异常,然后不会调用处理程序.我对吗? (2认同)