c# – PLINQ异常
我正在使用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. 但是,当我遇到这个文件时:
我想知道为什么我的代码不会以这种方式运行?如果在抛出异常后查询无法继续,则不会永远不会打印元素1,5,因为异常将已经抛出. 解决方法
从您提供的链接:
阿尔巴哈里的This section文章更好地解释了发生的事情:
抛出异常时,将不再处理集合中的更多值.但是,在抛出异常时,已经为所有5个int调用了方法Test(int).在这种情况下,PLINQ将等待这些方法调用(当前循环),并在完成所有调用后抛出AggregateException. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- xml vs. sqlite for android以及如何使用
- ruby-on-rails – RVM捆绑包安装缺少Gem错误
- xml – xsd:boolean元素类型接受“true”但不是“True” 我
- 浮点数正则表达式介于0和1之间
- ruby-on-rails – Phusion Passenger 4&nginx在Ubuntu
- Oracle SQL语句之常见优化方法总结
- react-native – 为Android和iOS开发组件的正确方法是什么?
- flash 自动化loader (感想)
- ruby-on-rails – Rspec控制器测试失败了撇号字符?
- C语言中extern的用法--转