Наблюдение за исключениями задачи в 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;
});
});