2012-06-25 42 views
1

我有一個非常基本的Windows窗體應用程序,在C#中工作,我試用了Background Worker。我大部分時間都在該頁面上跟隨了基本代碼。後臺工作人員在突然的程序結束時拋出異常

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
      progressBar.Value = e.ProgressPercentage; 
    } 

一切都很好,除非後臺工作人員在窗口在運行時關閉(例如按X)時正在進行工作。上述方法拋出一個空引用異常(我假設在progressBar?)。

我沒有把這個關閉方法:

private void Form_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if(bgWorker.WorkerSupportsCancellation == true) 
      bgWorker.CancelAsync(); 
    } 

但是,這並沒有解決問題。我想知道爲什麼會發生這種情況,我知道它與progressBar是隔離的,因爲如果我刪除該行,當我在繁忙時關閉窗口時不會引發異常。

+0

可能重複[如何停止BackgroundWorker窗體的關閉事件?](http://stackoverflow.com/questions/1731384/how-to-stop-backgroundworker-on-forms-closing-event) –

回答

2

是的,當你關閉窗口時,包含ProgressBar的控件被銷燬。試圖在沒有檢查的情況下從Bgw訪問它們將導致錯誤。

您可以維護這樣的:

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    if ((progressBar == null) || progressBar.IsDisposed) 
     return; 

    progressBar.Value = e.ProgressPercentage; 
} 

它是取消BGW還有一個好主意,但CancelAsync()本身是不夠的。 DoWork()中的代碼需要檢查取消標誌。

+0

我應該添加我進一步測試,如果我使用常規進度條,似乎不需要故障安全保護,但它在我之前使用的狀態欄進度條上失敗。不過謝謝你的建議。 – user17753

+0

_「不需要安全保護裝置」_--可能會回來咬你。這種問題很難重現。不要以爲你是安全的。 –