2016-08-05 36 views
2

我在捕獲在同一任務之外的Parallel.Invoke任務中拋出的異常時遇到了問題。Visual Studio 2010中的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")並生成一個新的主線程上的,可以被捕獲。

這似乎適用於一臺PC,但不適用於另一臺PC。

當我沒有調試器運行程序時,一切運行良好。

是否有特定的Visual Studio設置可能導致此?

我檢查是否有點擊Debugging/Exceptions/reset everything任何奇怪的設置,但沒有改進:

enter image description here

可誰都重現此問題?

+0

例外設置,打破所有拋出的異常也許吧? – leppie

+0

我試着在調試/例外情況下重置所有東西(我已經更新了我的問題以添加此內容)。我看不出有什麼區別。我拋出的兩個異常都是相同的基本類型:'new Exception()',但是'Parallel.Invoke'中只有一個不能被捕獲。 – HugoRune

回答

0

我發現這個怪異行爲的原因:

當設置just my code啓用,Visual Studio將總是打破的Parallel.Invoke內異常的,即使最終AggregateExpection正陷入用戶代碼

當該設置爲禁用,Visual Studio將內部沒有Parallel.Invoke異常的突破。只有在未捕獲到該異常的情況下,它纔會中斷所產生的AggregateException。

enter image description here

爲了防止視覺工作室從打破捕捉到的異常,同時保持設置just my code啓用,你必須打開Debugging/Exceptions

"Common language Runtime Exceptions/User-unhandled" 

小心刪除複選標記:此不是默認設置,當您點擊reset all時,此設置將恢復。

與刪除此複選標記後聽起來相反,Visual Studio仍會在未處理的異常(即不在任何try-catch塊內的異常)上中斷。

enter image description here