繁体   English   中英

使用PLINQ返回null

[英]returning null with PLINQ

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

我试图使用.AsParallel()。ForAll()来显着加速迭代(当然它应该这样做),但是当返回集合时,该集合中通常有一些对象是null。

我假设这可能是因为它在所有'业务'有机会完成之前返回集合? 如果我调试并放入断点,则没有空值。

我应该使用某种“等待这个操作完成”的方法吗?

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

答案取决于返回的含义,因为ForAll方法不会返回任何内容。 它会为集合的所有元素并行调用您指定的委托。 我想你的代码看起来像这样:

data.AsParallel().ForAll(() => /* calculate and store result somewhere */);
// more code

ForAll方法不等待所有委托完成,因此在所有委托完成之前可以执行more code (并且您还需要在store result somewhere小心一点,因为它可能同时为多个委托运行!)

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

var res = data.AsParallel().Select(() => /* calculate the result */);

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

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

即代替:

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

就像是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM