我正在重构我的程序以使用Parallel.ForEach。之前,当我使用常规for循环时,我正在使用Dispatcher更新WPF进度条,通过将当前数组索引除以数组大小来显示%completed。对于平行的foreach循环,这不能正确显示,即%跳跃,这是预期的。
如何为每个循环从并行更新WPF进度条,以便跟踪已完成的迭代次数?
答案 0 :(得分:9)
正如SLaks建议的那样,您应该只增加进度条值,而不是将其设置为您从Parallel.For
方法获得的当前索引。
但是,我会认真考虑使用一些比每次迭代向UI线程发送消息更便宜的方法。如果您有大量的迭代,那么每次迭代发送一条消息可能会非常苛刻。您可以声明局部变量count
并使用Interlocked.Increment
在并行化循环的主体中安全地增加变量。
然后你可以使用像if (count % 10 == 0) // ...
这样的东西,只在10次迭代后更新GUI。 (这不完全正确,因为其他线程可能会在您检查之前更新count
,但如果它只是为了GUI通知的目的,那么它应该无关紧要 - 您绝对不想使用{循环体中的{1}}。
或者,您可以创建一个Timer,它将重复检查GUI线程中lock
的值并更新进度条。这可能更容易,您可以保证进度条经常更新,但不能更多。
答案 1 :(得分:4)
每次完成操作时,都应该向UI线程发送消息(通过调用Dispatcher.BeginInvoke
将进度条增加1。