使用Parallel.ForEach时跟踪进度

Vin*_*nce 11 .net c# parallel-processing

我正在重构我的程序以使用Parallel.ForEach.之前,当我使用常规for循环时,我正在使用Dispatcher更新WPF进度条,通过将当前数组索引除以数组大小来显示%completed.使用并行的foreach循环,这不能正确显示,即%跳跃,这是预期的.

如何为每个循环从并行更新WPF进度条,以便跟踪已完成的迭代次数?

Tom*_*cek 9

正如SLaks建议的那样,您应该只增加进度条值,而不是将其设置为从Parallel.For方法获得的当前索引.

但是,我会认真考虑使用一些比每次迭代向UI线程发送消息更便宜的方法.如果您有大量的迭代,那么每次迭代发送一条消息可能会非常苛刻.您可以声明一个局部变量count并用于Interlocked.Increment在并行化循环的主体中安全地增加变量.

  • 然后你可以使用类似的东西if (count % 10 == 0) // ...,只在10次迭代后更新GUI.(这不完全正确,因为其他线程可能会count在您检查之前更新,但如果它只是为了GUI通知的目的,那么它应该无关紧要 - 您绝对不想lock在循环体中使用).

  • 或者,您可以创建一个Timer,它将重复检查countGUI线程的值并更新进度条.这可能更容易,您可以保证进度条经常更新,但不能更多.