本節書摘來自華章出版社《c#多線程程式設計實戰(原書第2版)》一書中的第3章,第3.8節,作者(美)易格恩·阿格佛溫(eugene agafonov),黃博文 黃輝蘭 譯,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
本節執行個體示範了另一種異步程式設計的方式,即使用backgroundworker元件。借助于該對象,可以将異步代碼組織為一系列事件及事件處理器。你将學會如何使用該元件進行異步程式設計。
為了學習本節,你需要安裝visual studio 2015。除此之外無需其他準備。本節的源代碼放置在booksampleschapter3recipe7目錄中。
請執行以下步驟來學習如何使用backgroundworker元件:
1.啟動visual studio 2015。建立一個c#控制台應用程式項目。
2.在program.cs檔案中加入以下using指令:

3.在main方法下面加入以下代碼片段:
4.在main方法中加入以下代碼片段:
5.運作程式。
當程式啟動時,建立了一個backgroundworker元件的執行個體。顯式地指出該背景工作者線程支援取消操作及該操作進度的通知。
接下來是最有意思的部分。我們沒有使用線程池和委托,而是使用了另一個c#文法,稱為事件。事件表示了一些通知的源或當通知到達時會有所響應的一系列訂閱者。在本例中,我們将訂閱三個事件,當這些事件發生時,将調用相應的事件處理器。當事件通知其訂閱者時,具有特殊的定義簽名的方法将被調用。
是以,除了将異步api組織為begin/end方法對,還可以隻啟動一個異步操作然後訂閱給不同的事件。這些事件在該操作執行時會被觸發。這種方式被稱為基于事件的異步模式(event-based asynchronous pattern,簡稱eap)。這是曆史上第二種用來構造異步程式的方式,現在更推薦使用tpl,第4章中将會描述該方式。
我們共定義了三個事件。第一個是dowork事件。當一個背景工作對象通過runworker-async方法啟動一個異步操作時,該事件處理器将被調用。該事件處理器将會運作線上程池中。如果需要取消操作,則這裡是主要的操作點。同時也可以提供該操作的運作程序資訊。最後,得到結果後,将結果設定給事件參數,然後runworkercompleted事件處理器将被調用。在該方法中,可以知道操作是成功完成,還是發生錯誤,抑或被取消。
基于此,backgroundworker元件實際上被使用于windows窗體應用程式(windows forms applications,簡稱wpf)中。該實作通過背景工作事件處理器的代碼可以直接與ui控制器互動。與線程池中的線程與ui控制器互動的方式相比較,使用backgroundworker元件的方式更加自然和好用。