在VS2005中添加了BackgroundWorker組件,該組件在多線程編程方面使用起來非常方便,然而在開始時由於沒有搞清楚它的使用機制,走了不少的彎路,現在把我在使用它的過程中的經驗與諸位分享一下。
BackgroundWorker類中主要用到的有這列屬性、方法和事件:
重要屬性:
1、CancellationPending
獲取一個值,指示應用程序是否已請求取消後台操作。通過在DoWork事件中判斷CancellationPending屬性可以認定是否需要取消後台操作(也就是結束線程);
2、IsBusy
獲取一個值,指示 BackgroundWorker 是否正在運行異步操作。程序中使用IsBusy屬性用來確定後台操作是否正在使用中;
3、WorkerReportsProgress
獲取或設置一個值,該值指示BackgroundWorker能否報告進度更新
4、WorkerSupportsCancellation
獲取或設置一個值,該值指示 BackgroundWorker 是否支持異步取消。設置WorkerSupportsCancellation為true使得程序可以調用CancelAsync方法提交終止掛起的後台操作的請求;
重要方法:
1、CancelAsync
請求取消掛起的後台操作
2、RunWorkerAsync
開始執行後台操作
3、ReportProgress
引發ProgressChanged事件
重要事件:
1、DoWork
調用 RunWorkerAsync 時發生
2、ProgressChanged
調用 ReportProgress 時發生
3、RunWorkerCompleted
當後台操作已完成、被取消或引發異常時發生
另外還有三個重要的參數是RunWorkerCompletedEventArgs以及DoWorkEventArgs、ProgressChangedEventArgs。
BackgroundWorker的各屬性、方法、事件的調用機制和順序:
從上圖可見在整個生活周期內發生了3次重要的參數傳遞過程:
參數傳遞1:此次的參數傳遞是將RunWorkerAsync(Object)中的Object傳遞到DoWork事件的DoWorkEventArgs.Argument,由於在這裡只有一個參數可以傳遞,所以在實際應用往封裝一個類,將整個實例化的類作為RunWorkerAsync的Object傳遞到DoWorkEventArgs.Argument;
參數傳遞2:此次是將程序運行進度傳遞給ProgressChanged事件,實際使用中往往使用給方法和事件更新進度條或者日志信息;
參數傳遞3:在DoWork事件結束之前,將後台線程產生的結果數據賦給DoWorkEventArgs.Result一邊在RunWorkerCompleted事件中調用RunWorkerCompletedEventArgs.Result屬性取得後台線程產生的結果。
另外從上圖可以看到DoWork事件是在後台線程中運行的,所以在該事件中不能夠操作用戶界面的內容,如果需要更新用戶界面,可以使用ProgressChanged事件及RunWorkCompleted事件來實現。
明白了BagkgroundWorker的事件調用順序和參數傳遞機制之後在使用該組件用於多線程編程的時候就可以輕松許多了。詳細的實例可以在我寫的天涯離線浏覽器中看到。