首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PLINQ返回null

用PLINQ返回null
EN

Stack Overflow用户
提问于 2010-02-18 23:45:31
回答 2查看 647关注 0票数 7

我有一个IEnumerable的扩展方法,然后遍历集合,做它的业务,然后返回一个新的IEnumerable。

我尝试使用.AsParallel().ForAll()来使用PLINQ,这大大加快了迭代速度(当然它应该这样做),但是当返回集合时,集合中通常有几个对象为null。

我假设这可能是因为在所有的“业务”都有机会完成之前,它就已经返回了集合?如果调试并放入断点,则不存在空值。

是否有某种‘等待此操作完成’的方法,我应该使用?

编辑:让更清楚一点,在forall中有业务逻辑,修改属性等等--有必要循环一个操作,而不是简单地选择一些东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-19 00:31:06

答案取决于返回的含义,因为ForAll方法不返回任何内容。它为集合的所有元素调用并行指定的委托。我假设您的代码如下所示:

代码语言:javascript
复制
data.AsParallel().ForAll(() => /* calculate and store result somewhere */);
// more code

ForAll方法不需要等待所有委托的完成,所以more code可以在所有委托完成之前执行(您还需要在store result somewhere位中小心,因为它可以为多个委托并发运行!)

我认为可以使用Select方法更优雅地重写代码:

代码语言:javascript
复制
var res = data.AsParallel().Select(() => /* calculate the result */);

在这种情况下,委托只返回结果。Where方法收集所有结果,当您在返回的IEnumerable上迭代时,它保证所有委托都完成了计算。

票数 1
EN

Stack Overflow用户

发布于 2010-02-19 01:14:07

ForAll()不执行合并,并立即返回。Parallel.ForEach()可能是您要寻找的功能。

代替:

collection.AsParallel().ForAll( t=>t.doWork() );

就像这样

Parallel.ForEach(collection.AsParallel(), t=>t.doWork());

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

https://stackoverflow.com/questions/2293091

复制
相关文章

相似问题

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