我有一个IEnumerable的扩展方法,然后遍历集合,开展业务,然后返回一个新的IEnumerable。
我曾尝试使用.AsParallel()。ForAll()来显着加速迭代(当然它应该这样做)但是当返回集合时,该集合中通常有一些对象是空。
我假设这可能是因为它在所有'业务'有机会完成之前返回集合?如果我调试并放入断点,则没有空值。
我应该使用某种“等待此操作完成”的方法吗?
编辑:要更清楚一点,在forall中有业务逻辑,修改属性等等。有必要让一个动作循环,而不是简单地选择一些东西。
答案 0 :(得分: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
时,它保证所有委托都完成计算。
答案 1 :(得分:0)
ForAll()
不执行合并,并立即返回。 Parallel.ForEach()
可能是您正在寻找的功能。
即代替:
collection.AsParallel().ForAll( t=>t.doWork() );
类似
Parallel.ForEach(collection.AsParallel(), t=>t.doWork());