Visual Studio 2010中的Parallel.Invoke中的Uncatchable异常

时间:2016-08-05 17:22:14

标签: c# visual-studio-2010 .net-4.0 task-parallel-library

我无法在同一任务之外捕获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总是在第二个异常时暂停程序(第一个例外没有问题)

enter image description here

我的期望是Parallel.Invoke吞下Exception("2")并在主线程上生成一个新的AggregateException,可以捕获。

这似乎适用于一台PC,但不适用于另一台PC。

当我在没有调试器的情况下运行程序时,一切运行正常。

是否存在可能导致此问题的特定Visual Studio设置?

我点击Debugging/Exceptions/reset everything检查了是否有任何奇怪的设置,但没有改进:

enter image description here

其他人可以重现这个问题吗?

1 个答案:

答案 0 :(得分:0)

我找到了这种奇怪行为的原因:

当设置just my code 启用时,Visual Studio将在Parallel.Invoke内的异常上始终打破,即使抓取了生成的AggregateExpection用户代码

当该设置为禁用时,Visual Studio将在Parallel.Invoke内的异常不中断。只有在没有捕获到该异常时,它才会破坏生成的AggregateException。

enter image description here

为了防止visual studio在保持设置just my code 的同时打破已捕获的异常,您必须打开Debugging / Exceptions并从

"Common language Runtime Exceptions / User-unhandled"

警告:这不是默认设置,当您点击reset all时,此设置将被还原。

与听起来如何相反,在删除此复选标记后,visual studio仍将中断未处理的异常,即不在任何try-catch块内的异常。

enter image description here