C# PLINQ例外
我正在使用PLINQ,代码如下:C# PLINQ例外,c#,.net,plinq,aggregateexception,C#,.net,Plinq,Aggregateexception,我正在使用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) {
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;
}
static void Main(字符串[]args)
{
var lt=new List(){1,2,3,4,5};
尝试
{
var nlt=lt.AsParallel().Select(Test).ToList();
}
捕获(聚合异常e)
{
foreach(e.InnerExceptions中的var ex)
{
控制台写入线(例如消息);
}
}
}
专用静态布尔测试(int n)
{
如果(n==1)
{
睡眠(1000);
}
如果(n==3)
{
睡眠(3000);
}
如果(n==5)
{
睡眠(5000);
}
如果(n==2 | | n==4)
{
抛出新异常(“新异常”);
}
WriteLine(“元素:{0}”,n);
返回true;
}
结果是aggregateException总是在5s后抛出(直到最后一个线程完成)。看起来,如果某些线程抛出异常,其余线程仍将继续运行。在最后一个线程完成后,框架聚合所有异常并将它们包装在aggregateException中
如果10个线程中有3个抛出异常,它将等待其余7个线程完成并在最后抛出aggreateexception,这是框架行为吗
然而,当我看到这份文件时:
引发异常后,查询无法继续。当应用程序代码捕捉到异常时,PLINQ已经停止了对所有线程的查询
我想知道为什么我的代码没有这样做?如果抛出异常后查询无法继续,元素1、3、5将永远不会打印,因为异常已经抛出。来自您提供的链接: 当允许异常冒泡返回到加入线程时,在引发异常后,查询可能会继续处理某些项 albahari的文章更好地解释了正在发生的事情: PLINQ和并行类都在遇到第一个异常时结束查询或循环执行-,不处理任何进一步的元素或循环体。但是,在当前周期完成之前,可能会抛出更多异常。AggregateException中的第一个异常在InnerException属性中可见 引发异常时,将不再处理集合中的值。但是,在抛出异常时,已经为所有5个int调用了方法
Test(int)
。在这种情况下,PLINQ将等待这些方法调用(当前周期),并在所有方法调用完成后抛出AggregateException