亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Parallel.Foreach 循環,與顯式 throw 語句不一致的行為

Parallel.Foreach 循環,與顯式 throw 語句不一致的行為

C#
海綿寶寶撒 2022-01-15 19:21:36
使用 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 回答

?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

這完全是預期的行為。

請參閱文檔

未處理的異常導致循環立即終止

當您拋出異常時,不會安排新的任務。

因此,行為將顯得不可預測。您無權期望所有子任務都會執行。這不是 Parallel.For 循環的合同。

當您將更多項目添加到源列表時,差異會更加明顯。輸出將始終顯示 ThreadPool.MinThreads 附近的許多異常。


查看完整回答
反對 回復 2022-01-15
  • 1 回答
  • 0 關注
  • 237 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號