我的應用程序中有兩個後臺工作人員填滿表併發送日誌消息。他們使用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()
功能被執行之前辦理? (或者說,根本不處理,因爲我們正在戒菸)。
是否有拼寫錯誤? waith_threads()而不是wait_threads()? – Guido
是的;)我縮短了代碼,錯過了那個.. – Gui13