我无法在同一任务之外捕获Parallel.Invoke
任务中抛出的异常。
在某些PC上,这样的异常将导致程序进入调试器,即使所有内容都在try catch
块内。
在其他PC上,这样的异常将被包装在AggregateException中,该异常可以在主线程上捕获。
以下程序在一台PC上正常运行,打印"I don't care"
& "whatever"
static void Main(string[] args)
{
try
{
throw new Exception("1");
}
catch (Exception ex)
{
Console.WriteLine("I don't care");
}
try
{
System.Threading.Tasks.Parallel.Invoke(
new Action[]{
()=>{throw new Exception("2");},
});
}
catch (Exception ex)
{
Console.WriteLine("whatever");
}
}
但是在另一台PC上,visual studio总是在第二个异常时暂停程序(第一个例外没有问题)
我的期望是Parallel.Invoke吞下Exception("2")
并在主线程上生成一个新的AggregateException
,可以捕获。
这似乎适用于一台PC,但不适用于另一台PC。
当我在没有调试器的情况下运行程序时,一切运行正常。
是否存在可能导致此问题的特定Visual Studio设置?
我点击Debugging/Exceptions/reset everything
检查了是否有任何奇怪的设置,但没有改进:
其他人可以重现这个问题吗?
答案 0 :(得分:0)
我找到了这种奇怪行为的原因:
当设置just my code
启用时,Visual Studio将在Parallel.Invoke内的异常上始终打破,即使抓取了生成的AggregateExpection用户代码
当该设置为禁用时,Visual Studio将在Parallel.Invoke内的异常不中断。只有在没有捕获到该异常时,它才会破坏生成的AggregateException。
为了防止visual studio在保持设置just my code
的同时打破已捕获的异常,您必须打开Debugging / Exceptions
并从
"Common language Runtime Exceptions / User-unhandled"
警告:这不是默认设置,当您点击reset all
时,此设置将被还原。
与听起来如何相反,在删除此复选标记后,visual studio仍将中断未处理的异常,即不在任何try-catch块内的异常。