7

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

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

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

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

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

4

2 回答 2

1

答案取决于您的意思返回,因为该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,它保证所有委托都完成了计算。

于 2010-02-19T00:31:06.777 回答
0

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

即代替:

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

就像是

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

于 2010-02-19T01:14:07.537 回答