Продолжение может определить, было ли исключение выдано антецедентом Task
свойством исключения задачи антецедента. Следующее выводит результаты NullReferenceException
на консоль
Task task1 = Task.Factory.StartNew (() => { throw null; });
Task task2 = task1.ContinueWith (ant => Console.Write(ant.Exception());
Если task1
выдает исключение, и это исключение не перехватывается / не запрашивается продолжением, оно считается необработанным, и приложение умирает. Для продолжения достаточно установить результат задачи по ключевому слову Status
.
asyncTask.ContinueWith(task =>
{
// Check task status.
switch (task.Status)
{
// Handle any exceptions to prevent UnobservedTaskException.
case TaskStatus.RanToCompletion:
if (asyncTask.Result)
{
// Do stuff...
}
break;
case TaskStatus.Faulted:
if (task.Exception != null)
mainForm.progressRightLabelText = task.Exception.InnerException.Message;
else
mainForm.progressRightLabelText = "Operation failed!";
default:
break;
}
}
Если вы не используете продолжения, вам придется подождать выполнение задачи в блоке try
/ catch
или запросить Result
задачи в блоке try
/ catch
int x = 0;
Task<int> task = Task.Factory.StartNew (() => 7 / x);
try
{
task.Wait();
// OR.
int result = task.Result;
}
catch (AggregateException aggEx)
{
Console.WriteLine(aggEx.InnerException.Message);
}
Надеюсь, это поможет, даже если уже немного поздно, и вы знаете все, что есть сейчас! :]