我正在重构我的程序以使用Parallel.ForEach。以前,当我使用常规的for循环时,我使用Dispatcher更新WPF进度条,通过将当前数组索引除以数组大小来显示完成百分比。对于并行foreach循环,这不能正确显示,如预期的%跳转。
如何从并行for each循环更新WPF进度条,以便跟踪已完成迭代的数量?
发布于 2010-10-06 09:44:26
正如SLaks建议的那样,您应该只增加进度条的值,而不是将它设置为从Parallel.For方法获得的当前索引。
但是,我会认真考虑使用比每次迭代都向UI线程发送消息更便宜的方式。如果您有大量的迭代,那么在每次迭代时发送一条消息可能是相当苛刻的。您可以声明一个局部变量count并使用Interlocked.Increment在并行化循环的主体中安全地递增该变量。
if (count % 10 == 0) // ...这样的东西在10次迭代后才能更新图形用户界面。(这并不完全正确,因为在您检查之前,其他线程可能会更新count,但如果它只是为了图形用户界面通知的目的,那么它应该无关紧要-您肯定不想在循环body).lock,您可以创建一个计时器,它将重复检查GUI线程中的count的值并更新进度条。这可能更简单,您可以保证进度条将更新得足够频繁,但不会更多。发布于 2010-10-06 09:30:33
每次完成操作时,都应该向UI线程发送一条消息(通过调用将进度条递增1的Dispatcher.BeginInvoke。
https://stackoverflow.com/questions/3868920
复制相似问题