Ожидание задачи с продолжением OnlyOnFapted вызывает AggregateException - PullRequest
38 голосов
/ 04 июля 2011

У меня есть простой код для воспроизведения:

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);
}

Однако я получаю неожиданное исключение TaskCanceledException, которое выдается в блоке try catch (он находится в объекте AggregateException InnerExceptions).«Задача была отменена».

Почему я получаю это исключение?Продолжение для задачи никогда не запускается, оно не создавало исключений, но я все еще получаю совокупное исключение при ожидании ....

Я надеюсь, что кто-то может объяснить, как это имеет смысл для меня :)

1 Ответ

55 голосов
/ 04 июля 2011

Вы не ожидаете задачи с продолжением OnlyOnFaults - вы ожидаете на этого продолжения (возвращается ContinueWith).Продолжение никогда не сработает, потому что исходное задание вернулось нормально, поэтому оно действует так, как если бы оно было отменено.

Имеет смысл для меня.

Я подозреваю, что вы хотите создать задачу, добавьтепродолжение, но затем подождите оригинальное задание:

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

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