如果在控制台应用程序中运行而不是将其抛出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();
正如评论中已经提到的,您不应该混合使用async
和Parallel.ForEach
,它们不能一起使用。
您所观察到的是其中的后果之一:lambda作为async void
方法进行编译,并且当async void
方法抛出异常时,该异常将重新抛出,SynchronizationContext
通常会导致应用程序崩溃。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句