[英]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.