首页
学习
活动
专区
圈层
工具
发布

PLINQ异常
EN

Stack Overflow用户
提问于 2015-09-07 01:54:48
回答 1查看 619关注 0票数 3

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

代码语言:javascript
复制
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将永远不会被打印,因为异常已经抛出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-07 02:10:09

从您提供的链接中:

当允许异常回滚回连接线程时,在引发异常后,查询可能会继续处理某些项。

这一节 of albahari的文章更好地解释了正在发生的事情:

PLINQ和并行类在遇到第一个异常()时结束查询或循环执行,不处理任何进一步的元素或循环体。但是,在当前周期完成之前,可能会引发更多异常。AggregateException中的第一个异常在InnerException属性中可见。

当抛出异常时,将不再处理集合中的值。但是,在抛出异常时,已经为所有5个ints调用了方法Test(int)。在这种情况下,PLINQ将等待这些方法调用(当前周期),并在它们完成后抛出AggregateException

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32430134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档