c# BackgroundWorker元件介紹(屬性、方法、事件)


在VS2005中添加了BackgroundWorker元件,該元件在多執行緒程式設計方面使用起來非常方便,然而在開始時由於沒有搞清楚它的使用機制,走了不少的彎路,現在把我在使用它的過程中的經驗與諸位分享一下。
    BackgroundWorker類中主要用到的有這列屬性、方法和事件:
    重要屬性:
    1、CancellationPending              獲取一個值,指示應用程式是否已請求取消後臺操作。通過在DoWork事件中判斷CancellationPending屬性可以認定是否需要取消後臺操作(也就是結束執行緒);
    2、IsBusy                           獲取一個值,指示 BackgroundWorker 是否正在運行非同步作業。程式中使用IsBusy屬性用來確定後臺操作是否正在使用中;
    3、WorkerReportsProgress            獲取或設置一個值,該值指示BackgroundWorker能否報告進度更新
    4、WorkerSupportsCancellation      獲取或設置一個值,該值指示 BackgroundWorker 是否支援非同步取消。設置WorkerSupportsCancellation為true使得程式可以調用CancelAsync方法提交終止掛起的後臺操作的請求;
    重要方法:
    1、CancelAsync          請求取消掛起的後臺操作
    2、RunWorkerAsync    提交一個啟動以非同步方式運行的操作的請求。發出該請求後,將引發 DoWork 事件,該事件隨後開始執行後臺操作。
    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的事件調用順序和參數傳遞機制之後在使用該元件用於多執行緒程式設計的時候就可以輕鬆許多了。

狼翔月影 發表在 痞客邦 PIXNET 留言(0) 人氣()