對於耗時操作(如檔案下載),讓主執行緒處理並非明智之舉,雖然開發起來較簡單。WinForm 程式設計準則之一是 Responsive(回應性),即讓使用者感覺程式持續在運作,而非當機(其實程式沒當機,只是沒給它表現機會)。.NET Framework 支援應用程式執行緒程式設計,可妥善解決此問題,但直接使用 Thread 和 ThreadStart 有時顯得繁瑣,因此 .NET 提供了 BackgroundWorker 元件應付簡單情境。
本文將分別闡述上述兩種情境下的跨執行緒操作控制項方法。
BackgroundWorker 是個好夥伴,能幫你處理髒活累活。具體來說:它能自動建立工作執行緒、回報工作進度、工作完成時通知並協助收尾、甚至可隨時取消工作。
BackgroundWorker 提供三個事件:DoWork、ProgressChanged 和 RunWorkerCompleted。DoWork 用於處理背景業務邏輯,將想讓工作執行緒在背景處理的代碼放入即可。但此事件中不能撰寫跨執行緒操作 UI 的代碼。如下圖,嘗試在 DoWork 中修改 Label.Text 會拋出例外:

例外情況:ToolStrip 及其衍生容器控制項上的某些控制項(如 StatusLabel)可在工作執行緒中直接操作。原因未深究,但根據提示訊息推測,這類控制項與 BackgroundWorker 由同一執行緒建立。
ProgressChanged 和 RunWorkerCompleted 事件分別用於回報工作進度與工作結束後的收尾操作,這兩個事件皆支援跨執行緒操作控制項。下面透過一個簡單範例驗證:將一個目錄中的檔案複製至另一目錄。

ListView 顯示複製資訊,更新狀態列進度條與目前處理檔案資訊MessageBox 提示複製檔案數量,同時清空來源與目標目錄資訊