Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PLINQ例外_C#_.net_Plinq_Aggregateexception - Fatal编程技术网

C# 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) {

我正在使用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;
    }
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