使用 Linqpad 創建了一個簡單的程序,我在Parallel Foreach循環中顯式拋出異常,理想情況下應在調用者中捕獲為Aggregate Exception,但是當我顯式拋出異常時,它有時會隨機跳過一些異常。我無法理解這種行為,任何人都可以解釋:void Main(){ try { var intList = new List<int> {1,2,3,4,5,6}; Parallel.ForEach(intList, i => Test1(i)); } catch (AggregateException aggregateException) { foreach (var ex in aggregateException.Flatten().InnerExceptions) { ex.Message.Dump(); } }}public void Test1(int i){ try { if (i % 2 != 0) throw new Exception($"{i} - Odd value exception"); } catch(Exception ex) { ex.Message.Dump(); throw; }}public void Test2(int i){ if (i % 2 != 0) throw new Exception($"{i} - Odd value exception");}public void Test3(int i) { try { if (i % 2 != 0) throw new Exception($"{i} - Odd value exception"); } catch(Exception ex) { ex.Message.Dump(); } }細節:有兩個版本的 Test,一個帶有顯式 Try Catch,另一個沒有兩者都具有相似的不一致行為,以至于在 Test1 中,即使本地 try catch 也不會打印該值可以有第三個版本Test3,它總是作為異常沒有明確地從并行循環中拋出Dump是一個 linqpad 打印調用替換它Console.WriteLine在視覺工作室這里有一個選項define ,它收集a中的所有異常,ConcurrentQueue稍后將它們作為聚合異常拋出,但是為什么當前代碼不能按預期工作,我不太確定。在這種情況下,我們期望輸出為:1 - Odd value exception
3 - Odd value exception
5 - Odd value exception但是其中一些是隨機跳過的,在一個簡單的程序中也是如此,在一個復雜的程序中會有更多的失誤,這會做更多的工作
- 1 回答
- 0 關注
- 237 瀏覽
添加回答
舉報
0/150
提交
取消