使用PLINQ返回null

ben*_*age 7 c# plinq

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

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

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

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

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

Tom*_*cek 1

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

data.AsParallel().ForAll(() => /* calculate and store result somewhere */);
// more code
Run Code Online (Sandbox Code Playgroud)

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

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

var res = data.AsParallel().Select(() => /* calculate the result */);
Run Code Online (Sandbox Code Playgroud)

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