使用Parallel.ForEach跟踪进度

使用Parallel.ForEach跟踪进度

问题描述:

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

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

由于SLaks提示进度条,你应该只增加了进度条值,而不是将它设置为从Parallel.For方法获得的当前索引

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

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

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

每次你完成的工作时间,你应该张贴消息到UI线程(通过调用Dispatcher.BeginInvoke该递增1