簡體   English   中英

PLINQ例外

[英]PLINQ exception

我正在使用PLINQ,代碼如下:

static void Main(string[] args)
    {
        var lt = new List<int>() {1,2,3,4,5};
        try
        {
            var nlt = lt.AsParallel().Select(Test).ToList();
        }
        catch (AggregateException e)
        {
            foreach (var ex in e.InnerExceptions)
            {
                Console.WriteLine(ex.Message);
            }
        }

    }

    private static bool Test(int n)
    {
        if (n == 1)
        {
            Thread.Sleep(1000);
        }
        if (n == 3)
        {
            Thread.Sleep(3000);
        }
        if (n == 5)
        {
            Thread.Sleep(5000);
        }
        if (n == 2 || n == 4)
        {
            throw new Exception("New exception");
        }
        Console.WriteLine("element : {0}", n);
        return true;
    }

結果是在5s之后總是拋出aggregateException(直到最后一個線程完成)。 似乎如果某些線程拋出異常,該線程的其余部分仍將繼續運行。 完成最后一個線程后,框架會聚合所有異常並將它們包裝在aggregateException中。

是框架行為,如果10個線程中有3個拋出異常,它將等待其余7個線程完成並在最后拋出aggreagteException。

但是,當我遇到這個文檔時: https//msdn.microsoft.com/en-us/library/dd460712(v = vs.110).aspx

拋出異常后,查詢無法繼續。 當您的應用程序代碼捕獲異常時,PLINQ已經停止了對所有線程的查詢。

我想知道為什么我的代碼不會以這種方式運行? 如果在拋出異常后查詢無法繼續,則不會永遠不會打印元素1,3,5,因為異常將已經拋出。

從您提供的鏈接:

當允許異常冒泡回到加入線程時,查詢可能會在引發異常后繼續處理某些項目。

這部分 albahari的文章更好地解釋了發生的事情:

PLINQ和Parallel類在遇到第一個異常時結束查詢或循環執行 - 不處理任何其他元素或循環體。 但是,在當前周期完成之前,可能會拋出更多異常 AggregateException中的第一個異常在InnerException屬性中可見。

拋出異常時,將不再處理集合中的更多值。 但是,在拋出異常時,已經為所有5個int調用了方法Test(int) 在這種情況下,PLINQ將等待這些方法調用(當前循環),並在完成所有調用后拋出AggregateException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM