我有一個相當長的並行foreach循環,我需要運行。網絡上將會有超過100臺計算機被訪問,每臺計算機上的每個操作都需要幾秒鐘的時間。並行的foreach循環似乎是加速這個過程的完美解決方案。檢查並行foreach循環的狀態
你能想出什麼樣的視覺線索能夠讓用戶更容易地看到循環的進展?很明顯,因爲它是多線程更新的GUI,代價昂貴且風險很大,所以我的問題是可以使用其他可視指標來顯示進度?
我有一個相當長的並行foreach循環,我需要運行。網絡上將會有超過100臺計算機被訪問,每臺計算機上的每個操作都需要幾秒鐘的時間。並行的foreach循環似乎是加速這個過程的完美解決方案。檢查並行foreach循環的狀態
你能想出什麼樣的視覺線索能夠讓用戶更容易地看到循環的進展?很明顯,因爲它是多線程更新的GUI,代價昂貴且風險很大,所以我的問題是可以使用其他可視指標來顯示進度?
那麼你不應該直接從後臺代碼更新UI線程,但你當然可以考慮更新一些共享的內存來溝通進度。
作爲一個非常簡單的例子,如果您的代碼可以被視爲一系列重複步驟,您可以只增加一個計數器。 Interlocked.Increment()
方法對此目的特別有用,因爲它不需要鎖定。然後,您的UI線程可以定期輪詢此計數器並報告它的價值 - 或者在可能的情況下對其進行可視化(或許是進度條或平均運行時間)。
如果涉及多臺機器,每臺機器保留一個計數器並報告整個任務在參與同行中的進展情況可能是有意義的。你也可以考慮可視化已完成步驟之間的平均流逝時間......這可以幫助系統用戶估計完成時間(也可以計算這個時間)。
更復雜的實現也是可能的。例如,您可以創建一個共享隊列,您可以在其中發佈日誌記錄信息或每個活動狀態。這可能會非常複雜......如果執行得不好可能會對性能產生不利影響。
或者,如果您希望收集大量有關您的分佈式過程的性能指標,可以考慮使用System.Diagnostics中的Performance Counters API。這是一條更復雜的路徑 - 但它可以讓您利用操作系統中的高性能指標收集和發佈實施,並允許您使用工具(如Perfmon)觀察和彙總性能信息。
您用於更新UI的具體機制取決於您使用的是什麼技術(WPF,WinForms,HTML)以及分佈式代碼和UI代碼是否在同一個進程中共同位於任何組件。如果分佈式/ UI部分未託管在單個進程中,那麼您可能需要使用某種形式的IPC來進行通信並將進度可視化。
我決定與Interlocked.Increment()一起使用計時器類來更新計數器的標籤。我真的很喜歡其他的想法,並且當我有更多時間時一定會檢查它們! – DTown 2010-09-27 19:55:27
http://ajaxload.info/ :) – 2010-09-27 19:19:52
「視覺指標可以用來顯示進度?」總是多處理的,否則在任務期間你不會看到任何更新。 – RvdK 2010-09-27 19:32:50