正常情况下使用多线程出现异常时,都是按照单个任务去处理异常,在线程间不需要通信的情况下,任务之间互不影响,主线程也不必知道子线程是否发成异常。
那么只需要处理子线程异常即可
Task.Run(() =>
{
try
{
throw new Exception("error message");
}
catch (Exception ex)
{
Console.WriteLine("出现异常,记录日志,业务回滚等等...");
}
});
但是在某些复杂业务中,多个线程在执行过程中如果出现异常需要反馈给主线程,所以需要在子线程出现异常时通知主线程。
实现方式:
- 使用
Task.WaitAll
,使主线程阻塞。
try
{
List<Task> tasks = new List<Task>();
tasks.Add(Task.Run(() => {
throw new Exception("error message");
}));
Task.WaitAll(tasks.ToArray());
}
catch (AggregateException ex)
{
foreach (var except in ex.InnerExceptions)
{
Console.WriteLine(except.Message);
}
}
执行结果:
2. 使用非阻塞Task.Factory.ContinueWhenAll
List<Task> tasks = new List<Task>();
tasks.Add(Task.Run(() => {
throw new Exception("error message");
}));
//Task.WaitAll(tasks.ToArray());
Task.Factory.ContinueWhenAll(tasks.ToArray(),
t =>
{
foreach (var task in t)
{
if (task.IsFaulted)
{
AggregateException aggEx = task.Exception;
Console.WriteLine(aggEx.Message);
}
}
});
打印结果:
One or more errors occurred. (error message)