问题 使用Parallel.ForEach时跟踪进度


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

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


6281
2017-10-06 01:24


起源



答案:


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

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

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

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


9
2017-10-06 01:44





每次完成操作时,都应该向UI线程发送消息(通过调用 Dispatcher.BeginInvoke 将进度条增加1。


4
2017-10-06 01:30