天天看點

C#在背景運作操作:BackgroundWorker的用法

在我們的程式中,經常會有一些耗時較長的運算,為了保證使用者體驗,不引起界面不響應,我們一般會采用多線程操作,讓耗時操作在背景完成,完成後再進行處理或給出提示,在運作中,也會時時去重新整理界面上的進度條等顯示,必要時還要控制背景線程中斷目前操作。

以前,類似的應用會比較麻煩,需要寫的代碼較多,也很容易出現異常。在.net中,提供了一個元件backgroundworker就是專門解決這個問題的。backgroundworker類允許在單獨的專用線程上運作操作。 耗時的操作(如下載下傳和資料庫事務)在長時間運作時可能會導緻使用者界面(ui)似乎處于停止響應狀态。如果需要能進行響應的使用者界面,而且面臨與這類操作相關的長時間延遲,則可以使用backgroundworker類友善地解決問題。

使用這個元件其實非常簡單,例如,我們做一個類似如下界面的進度條的小例子,在背景線程中進行耗時運算,同時重新整理界面上的進度條。

過程如下:

1.建立一個windows窗體應用程式,如:backgroundworkerprogressbardemo

2.拖一個progressbar(progressbar1)和一個backgroundworker (backgroundworker1)到form上。

3.把下面的代碼copy過去就ok了,代碼注釋的很詳細,可以按照需要修改。

C#在背景運作操作:BackgroundWorker的用法
C#在背景運作操作:BackgroundWorker的用法

若要為背景操作做好準備,請添加dowork事件的事件處理程式,在此事件處理程式中調用耗時的操作。

若要開始此操作,請調用runworkerasync。

若要收到進度更新的通知,請處理progresschanged 事件。

若要在操作完成時收到通知,請處理runworkercompleted 事件。

注意:

您必須非常小心,確定在 dowork 事件處理程式中不操作任何使用者界面對象。 而應該通過 progresschanged 和 runworkercompleted 事件與使用者界面進行通信。

backgroundworker 事件不跨 appdomain 邊界進行封送處理。 請不要使用 backgroundworker 元件在多個 appdomain 中執行多線程操作。

如果背景操作需要參數,請在調用 runworkerasync 時給出參數。 在 dowork 事件處理程式内部,可以從 doworkeventargs.argument 屬性中提取該參數。

參考:

<a href="http://msdn.microsoft.com/zh-cn/library/vstudio/system.componentmodel.backgroundworker(v=vs.100).aspx">http://msdn.microsoft.com/zh-cn/library/vstudio/system.componentmodel.backgroundworker(v=vs.100).aspx</a>

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

http://www.cnblogs.com/luxiaoxun/p/3221154.html