在UI程序設計中使用BackgroundWorker進行多線程異步處理

   WinForm的應用程序中如果執行了一個的非常冗長的處理操作,(比如文件檢索,大運算量計算),在執行時就會鎖定用戶界面,雖然主活動窗口還在運行,但用戶無法與程序交互,無法移動窗體或改變窗體大小,導致程序的用戶體驗極差。這個問題在UI開發中常常遇到,比較棘手。

    .NET Framework 2.0中新增的BackgroundWorker 類爲解決這個問題提供了方便、快捷的途徑。BackgroundWorker 可以用於啓動後臺線程,並在後臺計算結束後調用主線程的方法    

     同樣的功能使用委託的異步調用也可以實現,但使用BackgroundWorker的話會更加的簡便快捷,可以節省開發時間。

    第一:主要的事件及參數。
          1.DoWork——當執行BackgroundWorker.RunWorkerAsync方法時會觸發該事件,並且傳遞DoWorkEventArgs參;

          2.RunWorkerCompleted——異步操作完成後會觸發該事件,當然如果需要在操作過程中結束可以執行BackgroundWorker.CancelAsync方法要求異步調用中止,並且在異步委託操作中檢測BackgroundWorker.CancellationPending屬性如果爲true的話,跳出異步調用,同時將DoWorkEventArgs.Cancel屬性設爲true,這樣當退出異步調用的時候,可以讓處理RunWorkerCompleted事件的函數知道是正常退出還是中途退出。
          3.ProgressChanged——操作處理中獲得的處理狀態變化,通過BackgroundWorker.ReportProgress(int)方法觸發該事件,並且傳遞ProgressChangedEventArgs,其中包含了處理的百分比,這個參數在UI界面上設置progressbar控件。      
             第二:主要的方法。
         BackgroundWorker.RunWorkerAsync——“起動”異步調用的方法有兩次重載RunWorkerAsync(),RunWorkerAsync(object argument),第二個重載提供了一個參數,可以供異步調用使用。(如果有多個參數要傳遞怎麼辦,使用一個類來傳遞他們吧)。調用該方法後會觸發DoWork事件,並且爲處理DoWork事件的函數DoWorkEventArg事件參數,其中包含了RunWorkerAsync傳遞的參數。在相應DoWork的處理函數中就可以做具體的複雜操作。
         BackgroundWorker.ReportProgress——需要在一個冗長的操作中向用戶不斷反饋進度,這樣的話就可以調用的ReportProgress(int percent),在調用 ReportProgress 方法時,觸發ProgressChanged事件。提供一個在 0 到 100 之間的整數,它表示後臺活動已完成的百分比。你也可以提供任何對象作爲第二個參數,允許你 給事件處理程序傳遞狀態信息。作爲傳遞到此過程的 ProgressChangedEventArgs 參數屬性,百分比和你自己的對象(如果提供的話)均要被傳遞到 ProgressChanged 事件處理程序。這些屬性被分別命名爲 ProgressPercentage 和 UserState,並且你的事件處理程序可以以任何需要的方式使用它們。(注意:只有在BackgroundWorker.WorkerReportsProgress屬性被設置爲true該方法纔可用)。
         BackgroundWorker.CancelAsync——但需要退出異步調用的時候,就調用的這個方法。但是樣還不夠,因爲它僅僅是將BackgroudWorker.CancellationPending屬性設置爲true。你需要在具體的異步調用處理的時候,不斷檢查BackgroudWorker.CancellationPending是否爲true,如果是真的話就退出。(注意:只有在BackgroundWorker.WorkerSupportsCancellation屬性被設置爲true該方法纔可用)。

發佈了52 篇原創文章 · 獲贊 1 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章