在Windows Form應用中,BackgroundWorker 類允許您在單獨的專用線程上運行操作。耗時的操作(如下載和數據庫事務)在長時間運行時可能會導致用戶界面 (UI) 似乎處於停止響應狀態。如果您需要能進行響應的用戶界面,而且面臨與這類操作相關的長時間延遲,則可以使用 BackgroundWorker 類方便地解決問題。由於操作是異步執行的,用戶可能在異步操作執行過程中關閉當前窗體,而窗體的關閉會伴隨著Dispose方法的執行。如果我們注冊了BackgroundWorker的RunWorkerCompleted事件,並且在該事件處理程序中需要操作這個被Disposed的窗體,就會出現一些無法預知的異常。
我們寫一個簡單的例子來說明上述的場景:在一個非主窗體(主窗體的關閉會導致程序的終止)的Windows窗體中,一個BackgroundWorker被用於異步地執行一段耗時的操作。在我們的例子中,通過讓線程休眠10秒來模擬這個“耗時操作”。方法backgroundWorker_RunWorkerCompleted是BackgroundWorker的RunWorkerCompleted事件處理方法,在這裡我們通過MessageBox來顯示當前窗體的IsDisposed屬性值。注冊到該BackgroundWorker的異步操作通過點擊某個按鈕開啟。相關的代碼如下所示。
1: public partial class BgwForm : Form
2: {
3: public BgwForm()
4: {
5: InitializeComponent();
6: }
7:
8: private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
9: {
10: Thread.Sleep(10000);
11: }
12: