天天看點

C#基礎知識回顧--BackgroundWorker介紹

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上的例子: