正如 Ani 所说,这些AggregateExceptions
可以通过多个连续Task
的 s 使用延续来观察异常来创建。
Task t1 = Task.Factory.StartNew(() => { throw new Exception(); });
Task t2 = Task.Factory.StartNew(() => { throw new Exception(); });
Task t3 = Task.WhenAll(t1, t2)
.ContinueWith(t => t.Exception.InnerExceptions.Count(),
TaskContinuationOptions.OnlyOnFaulted);
通常你会AggregateException
在一个延续中处理。Task
延续可以通过前面任务的异常属性来查明前面是否抛出了异常。以下将 a 的结果打印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.Flatten().Message;
else
mainForm.progressRightLabelText = "Operation failed!";
default:
break;
}
}
在上面我只期望一个例外 - 以确保这是我可以调用的情况Flatten()
。如果您期望其他类型的异常,您可以根据需要遍历InnerException
s。
我希望这有帮助。