为什么异步 Parallel.ForEach 中的异常会使应用程序崩溃?
Why does an exception in an async Parallel.ForEach crash the application?
如果 运行 在控制台应用程序内而不是抛出 AggregateException
并被外部 try/catch
捕获,为什么以下会崩溃?
为简洁起见,我简化了 await
的用例,但在相关代码中,我确实在尝试执行一个可等待的 Task
重要性。
var list = new List<string>() {"Error"};
try
{
Parallel.ForEach(list, new ParallelOptions()
{
MaxDegreeOfParallelism = 8
}, async listEntry =>
{
await Task.Delay(5000);
throw new Exception("Exception");
});
}
catch (Exception ex)
{
//never hits, the application crashes
}
Console.ReadLine();
我注意到以下不会导致应用程序失败,并且确实捕获了异常,但我不明白这两个上下文的根本不同究竟是怎么回事:
var list = new List<string>() {"Error"};
try
{
Parallel.ForEach(list, new ParallelOptions()
{
MaxDegreeOfParallelism = 8
}, listEntry =>
{
throw new Exception("Exception");
});
}
catch (Exception ex)
{
//exception is caught, application continues
}
Console.ReadLine();
如评论中所述,you shouldn't mix async
and Parallel.ForEach
,它们不能一起工作。
您观察到的结果之一是:lambda 被编译为 async void
方法,当 async void
方法抛出时,异常会在 [=14] 上重新抛出=],这通常会使应用程序崩溃。
如果 运行 在控制台应用程序内而不是抛出 AggregateException
并被外部 try/catch
捕获,为什么以下会崩溃?
为简洁起见,我简化了 await
的用例,但在相关代码中,我确实在尝试执行一个可等待的 Task
重要性。
var list = new List<string>() {"Error"};
try
{
Parallel.ForEach(list, new ParallelOptions()
{
MaxDegreeOfParallelism = 8
}, async listEntry =>
{
await Task.Delay(5000);
throw new Exception("Exception");
});
}
catch (Exception ex)
{
//never hits, the application crashes
}
Console.ReadLine();
我注意到以下不会导致应用程序失败,并且确实捕获了异常,但我不明白这两个上下文的根本不同究竟是怎么回事:
var list = new List<string>() {"Error"};
try
{
Parallel.ForEach(list, new ParallelOptions()
{
MaxDegreeOfParallelism = 8
}, listEntry =>
{
throw new Exception("Exception");
});
}
catch (Exception ex)
{
//exception is caught, application continues
}
Console.ReadLine();
如评论中所述,you shouldn't mix async
and Parallel.ForEach
,它们不能一起工作。
您观察到的结果之一是:lambda 被编译为 async void
方法,当 async void
方法抛出时,异常会在 [=14] 上重新抛出=],这通常会使应用程序崩溃。