組件介紹
BackgroundWorker類位於System.ComponentModel 命名空間中,通過該類在單獨的線程上執行操作實現基於事件的異步模式。下面對BackgroundWorker類的主要成員進行介紹。
BackgroundWorker類的第1個主要方法是RunWorkerAsync,該方法提交壹個以異步方式啟動運行操作的請求,發出請求後,將引發 DoWork 事件,在事件處理程序中開始執行異步操作代碼。RunWorkerAsync 方法簽名如下,
publicvoidRunWorkerAsync();
publicvoidRunWorkerAsync(Object argument);
如果異步操作需要操作參數,可以將其作為argument參數提供,由於參數類型為Object,因此訪問時可能需要進行類型轉換。
CancelAsync 方法提交終止異步操作的請求,並將 CancellationPending 屬性設置為 true。需要註意的是,CancelAsync 方法是否調用成功,同WorkerSupportsCancellation 屬性相關,如果允許取消執行的異步操作,需將WorkerSupportsCancellation 屬性設置為true,否則調用該方法將拋出異常。CancelAsync方法不含參數,方法簽名如下,
publicvoid CancelAsync();
調用 CancelAsync 方法時,BackgroundWorker的 CancellationPending 屬性值將被設置為true,因此在編寫單獨線程中執行的輔助方法時,代碼中應定期檢查 CancellationPending 屬性,查看是否已將該屬性設置為 true,如果為true,應該結束輔助方法的執行。有壹點需要註意的是,DoWork 事件處理程序中的代碼有可能在發出取消請求時已經完成處理工作,因此,DoWork事件處理程序或輔助方法可能會錯過設置CancellationPending屬性為true的時機。在這種情況下,即使調用 CancelAsync方法發出了取消異步操作請求,RunWorkerCompleted 事件處理程序中RunWorkerCompletedEventArgs 參數的 Cancelled 標誌也不會被設置為 true,這是在多線程編程中經常會出現的競爭條件問題,因此編寫代碼的時候需要考慮。
在執行異步操作時,如果需要跟蹤異步操作執行進度,BackgroundWorker類提供了 ReportProgress 方法,調用該方法將引發 ProgressChanged 事件,通過註冊該事件在事件處理程序中獲取異步執行進度信息。方法簽名如下:
publicvoidReportProgress(int percentProgress);
publicvoidReportProgress(int percentProgress,Object userState);
該方法包含兩個版本,percentProgress表示進度百分比,取值為0-100,userState為可選參數表示自定義用戶狀態。
同CancelAsync 方法壹樣,BackgroundWorker的WorkerReportsProgress 屬性設置為 true時,ReportProgress 方法才會調用成功,否則將引發InvalidOperationException異常。
上面已經提到了BackgroundWorker的3個屬性,CancellationPending用來提示操作是否已經取消,WorkerReportsProgress和WorkerSupportsCancellation分別用來設置是否允許進度匯報和進行取消操作。
publicboolCancellationPending { get; }
publicboolWorkerReportsProgress { get; set; }
publicboolWorkerSupportsCancellation { get; set; }
另外壹個會用到的屬性是IsBusy,
publicbool IsBusy { get; }
通過該屬性查詢BackgroundWorker實例是否正在運行異步操作,如果 BackgroundWorker 正在運行異步操作,則為true,否則為false。
BackgroundWorker類包含3個事件,在事件處理程序中可進行異步操作輔助代碼編寫和同用戶界面信息交互。
publiceventDoWorkEventHandler DoWork;
publiceventProgressChangedEventHandler ProgressChanged;
publiceventRunWorkerCompletedEventHandler RunWorkerCompleted;
DoWork事件處理程序用來調用輔助方法進行實際處理操作,由於該事件處理程序在不同於UI的線程上執行,因此需要確保在 DoWork 事件處理程序中不操作任何用戶界面對象。如果輔助方法需要參數支持,可以通過RunWorkerAsync方法傳入,在 DoWork 事件處理程序中,通過 DoWorkEventArgs.Argument 屬性提取該參數。在異步操作期間,可以通過 ProgressChanged事件處理程序獲取異步操作進度信息,通過RunWorkerCompleted 事件處理程序獲取異步操作結果信息,在ProgressChanged和RunWorkerCompleted的事件處理程序中可以安全的同用戶界面進行通信。