Подтвердить что ты не робот

Ожидание задачи с продолжением OnlyOnFaulted вызывает исключение AggregateException

У меня есть простой код в качестве репрограммы:

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, которое вызывается в блоке catch try (он находится в объекте AggregateException InnerExceptions). "Задача была отменена".

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

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

4b9b3361

Ответ 1

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

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

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

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

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