BackgroundWorker是.net裡用來執行多線程任務的控件,它允許程式設計者在一個單獨的線程上執行一些操作。耗時的操作(如下載下傳和資料庫事務)在長時間運作時可能會導緻使用者界面 (UI) 始終處于停止響應狀态。如果您需要能進行響應的使用者界面,而且面臨與這類操作相關的長時間延遲,則可以使用BackgroundWorker類友善地解決問題。
該控件有三個事件:
DoWork 、ProgressChanged 和 RunWorkerCompleted
在程式中調用RunWorkerAsync方法則會啟動DoWork事件的事件處理,當在事件處理過程中,調用 ReportProgress方法則會啟動ProgressChanged事件的事件處理,而當DoWork事件處理完成時,則會觸發RunWorkerCompleted事件。
您必須非常小心,確定在 DoWork 事件處理程式中不操作任何使用者界面對象。而應該通過 ProgressChanged和 RunWorkerCompleted 事件與使用者界面進行通信。
void backgroundWorker1_DoWork( Object sender, DoWorkEventArgs e )
其中句柄sender指向的就是該BackgroundWorker控件。
第二個參數e有三個屬性,Argument,Cancel和Result。
Argument:
Cancel:
DoWork 事件處理程式中的代碼應定期檢查 CancellationPending屬性值,并在該值為true時中止操作。出現這種情況時,可以将 System.ComponentModel.DoWorkEventArgs 的 Cancel标志設定為true,同時将 RunWorkerCompleted 事件處理程式中的 System.ComponentModel.RunWorkerCompletedEventArgs的 Cancelled 标志設定為true。
Result:
等下面講到RunWorkerCompleted事件時再細說。
當DoWork事件處理完成之後,将會觸發該事件。
void backgroundWorker1_RunWorkerCompleted( Object sender, RunWorkerCompletedEventArgs e )
現在主要講第二個參數e,最重要的屬性是Result。
在DoWork事件中,你将Result設定成什麼,這裡的Result就傳回什麼。
在DoWork事件的處理過程中,如果調用ReportProgress則會發生該事件。
void backgroundWorker1_ProgressChanged( Object sender, ProgressChangedEventArgs e )
先來說說ReportProgress的兩種重載:
void ReportProgress(int percentProgress)
void ReportProgress(int percentProgress,Object userState)
好,下面來一段MSDN上的例子: