2010-10-06 126 views
11

我正在重構我的程序以使用Parallel.ForEach。之前,當我使用常規for循環時,我正在使用Dispatcher更新WPF進度條,通過將當前數組索引除以數組大小來顯示%完成。使用並行的foreach循環,這不能正確顯示,即%跳轉eratically,這是預期的。使用Parallel.ForEach跟蹤進度

如何從每個循環的並行更新WPF進度條,以便我可以跟蹤完成的迭代次數?

回答

9

由於SLaks提示進度條,你應該只增加了進度條值,而不是將它設置爲從Parallel.For方法獲得的當前索引

但是,我會認真考慮使用一些比每次迭代都向UI線程發送消息更便宜的方法。如果您有大量迭代,那麼每次迭代都要發送一條消息可能會相當苛刻,你可以聲明一個局部變量count d使用Interlocked.Increment在並行環路的主體中安全地增加變量。

  • 然後,您可以使用類似if (count % 10 == 0) // ...的東西來更新GUI,只有10次迭代後。 (這是不完全正確的,因爲其他線程可能會在您檢查之前更新count,但如果它僅用於GUI通知的目的,那麼它應該沒有關係 - 您肯定不希望在循環體中使用lock )。

  • 或者,您可以創建一個Timer,它將重複檢查GUI線程中的count的值並更新進度欄。這可能更容易,你可以保證進度條會經常更新,但不會更多。