Наблюдение за исключениями задачи в ContinueWith

Существуют различные способы наблюдения за исключениями, возникающими в задачах. Один из них находится в ContinueWith с OnlyOnFaulted:

var task = Task.Factory.StartNew(() =>
{
    // Throws an exception 
    // (possibly from within another task spawned from within this task)
});

var failureTask = task.ContinueWith((t) =>
{
    // Flatten and loop (since there could have been multiple tasks)
    foreach (var ex in t.Exception.Flatten().InnerExceptions)
        Console.WriteLine(ex.Message);
}, TaskContinuationOptions.OnlyOnFaulted);

Мой вопрос: выполняются ли исключения автоматически после того, как начался сбой, или они наблюдаются только после того, как я коснусь сообщения ex.Message?

Ответ 1

Они рассматриваются как наблюдаемые после доступа к свойству Exception.

См. также AggregateException.Handle. Вместо этого вы можете использовать t.Exception.Handle:

t.Exception.Handle(exception =>
            {
            Console.WriteLine(exception);
            return true;
            }
    );

Ответ 2

образец

Task.Factory.StartNew(testMethod).ContinueWith(p =>
            {
                if (p.Exception != null)
                    p.Exception.Handle(x =>
                        {
                            Console.WriteLine(x.Message);
                            return false;
                        });
            });