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 块中抛出了一个意外的 TaskCanceledException(它在 AggregateException InnerExceptions 对象中)。“任务被取消”。

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

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

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 回答