Dot-Net
BackgroundWorker 與後台執行緒
我有一個關於我應該在 Windows 窗體應用程序上使用的後台執行緒實現的選擇的風格問題。目前我有一個
BackgroundWorker具有無限(while(true))循環的表單。在這個循環中,我WaitHandle.WaitAny用來保持執行緒打盹,直到發生有趣的事情。我等待的事件句柄之一是“StopThread”事件,以便我可以跳出循環。這個事件在我被覆蓋時發出信號Form.Dispose()。我在某處讀到了
BackgroundWorker真正適用於您不想與 UI 綁定並具有有限結束的操作的地方 - 例如下載文件或處理一系列項目。在這種情況下,“結束”是未知的,只有當視窗關閉時。因此,我是否更適合使用後台執行緒而不是BackgroundWorker為此目的?
根據我對您問題的理解,您使用的
BackgroundWorker是標準執行緒。
BackgroundWorker推薦用於不想佔用 UI 執行緒的事情的原因是因為它在進行 Win Forms 開發時會暴露一些不錯的事件。事件喜歡
RunWorkerCompleted線上程完成它需要做的事情時發出信號,以及ProgressChanged線上程進度上更新 GUI 的事件。因此,如果您不使用這些,我認為使用標準執行緒來完成您需要做的事情沒有任何害處。
我的一些想法…
- 如果您有一個在後台執行且需要與 UI 互動的任務,請使用BackgroundWorker 。將數據和方法呼叫編組到 UI 執行緒的任務通過其基於事件的模型自動處理。避免 BackgroundWorker 如果…
- 您的程序集沒有或不直接與 UI 互動,
- 你需要執行緒是前台執行緒,或者
- 您需要操縱執行緒優先級。
- 需要效率時使用ThreadPool執行緒。ThreadPool 有助於避免與創建、啟動和停止執行緒相關的成本。避免使用 ThreadPool 如果…
- 該任務在您的應用程序的整個生命週期內執行,
- 你需要執行緒是前台執行緒,
- 您需要操縱執行緒優先級,或者
- 您需要執行緒具有固定的身份(中止、掛起、發現)。
- 將Thread類用於長時間執行的任務以及當您需要正式執行緒模型提供的功能時,例如在前台和後台執行緒之間進行選擇、調整執行緒優先級、對執行緒執行進行細粒度控制等。