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

时间:2011-07-04 15:59:30

标签: c# parallel-processing task task-parallel-library pfx

我有一些简单的代码作为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);
}

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

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

我希望有人可以解释这对我有什么意义:)

1 个答案:

答案 0 :(得分:55)

你没有等待带有一个OnlyOnFaulted延续的任务 - 你正在等待 on 那个继续(由ContinueWith返回)。延续永远不会触发,因为原始任务正常返回,所以它就像被取消一样。

对我有意义。

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

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

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