2013-04-17 79 views
0

我的應用程序中有兩個後臺工作人員填滿表併發送日誌消息。他們使用ReportProgress方法的「userState」傳輸這些數據。
他們通過連接到主線程:C#後臺工作人員:調用Close()時的異常

msg_worker.DoWork    += message_worker_task; 
msg_worker.ProgressChanged  += msg_worker_ProgressChanged; 
msg_worker.RunWorkerCompleted += worker_completed; 

data_worker.DoWork    += data_worker_task; 
data_worker.ProgressChanged += data_worker_ProgressChanged; 
data_worker.RunWorkerCompleted += worker_completed; 

他們使用,他們設置他們的doWork任務月底,兩家的EventWaitHandle項同步:

private void message_worker_task(object sender, DoWorkEventArgs e) 
    { 
     try 
     { 
      while(..){ 
       // do work 
       bw.ReportProgress(10, new String("my message to append")); 
      } 
     } 
     finally 
     { 
      e.Result = 0; 
      msg_done.Set(); // EventWaitHandle 
     } 
    } 

進展改變代表插入數據/登錄用戶可見的組件。現在

,問題是,當我在UI點擊退出按鈕,我伺候那些2線這樣的:

private void wait_threads() 
    { 
     int timeout = 30000; 
     Cursor.Current = Cursors.WaitCursor; 
     if (data_worker.IsBusy && !data_worker.CancellationPending) 
     { 
      data_worker.CancelAsync(); 
      data_done.WaitOne(timeout); 
     } 
     if (msg_worker.IsBusy && !msg_worker.CancellationPending) 
     { 
      msg_worker.CancelAsync(); 
      msg_done.WaitOne(timeout); 
     } 
     Cursor.Current = Cursors.Default; 
    } 

這似乎是工作(我用它在其他地方代碼),但在這個「退出」的情況下,我有一個異常提出,說我試圖插入數據到我有的日誌組件。該組件由RunWorkerCompleted委託操縱。

退出被點擊時被執行的代碼是這樣的:

private void quit_Click(object sender, EventArgs e) 
    { 
     wait_threads(); // blocks until threads are finished 
     Close(); 
    } 

我想我想通了,在等待線程來完成的,他們送過去的事:RunWorkerCompleted。 問題是我正在關閉()我的表單的過程中,這意味着表單沒有處於正確的狀態。 更重要的是,如果我在worker_completed功能檢查e.Cancelled標誌,我認爲這是錯誤的...

我能做些什麼,以確保RunWorkerCompleted是我Close()功能被執行之前辦理? (或者說,根本不處理,因爲我們正在戒菸)。

+0

是否有拼寫錯誤? waith_threads()而不是wait_threads()? – Guido

+0

是的;)我縮短了代碼,錯過了那個.. – Gui13

回答

0

我想你可以在調用ReportProgress之前檢查屬性Cancellation Pending。

while(..){ 
    if (!bw.CancellationPending) 
       bw.ReportProgress(10, new String("my message to append")); 
} 
+0

其實,我可能錯了。我想那是引發異常的RunWorkerCompleted。在代碼中我看到我也使用了這些組件。 – Gui13

+0

如果你在'DataWorkerComplete'中設置的'WaitHandle'上的'Close()'之前加了'WaitOne'? – misleadingTitle