我正在啓動一個WinForms應用程序,該應用程序正在啓動多個後臺工作人員。當一個後臺工作人員完成時,如果結果失敗,則會通過ShowDialog(this)
方法顯示一個對話框。問題是多個後臺工作者結果失敗時,它會同時顯示多個對話框。我不認爲這是可能的,但它顯然是。我正在閱讀關於消息循環的一些內容,並且似乎即使對話框已打開,消息循環仍在處理消息,這意味着即使對話框已經打開,完成的runworker也會被調用。我雖然可以在對話框中使用「lock(myObject)」,但它似乎沒有,我猜測,因爲同一個線程每次都調用鎖。BackgroundWorker中的ShowDialog RunWorkerCompleted
那麼解決這個問題的適當方法是什麼?我是半個誘惑,只是使用標誌和一個循環是這樣的:
public bool dialogOpen = false;
public bool cancelMessages = false;
public void x_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
while (dialogOpen) {}
if (cancelMessages) return;
dialogOpen = true;
MyDialog dlg = new MyDialog("Something went wrong.");
if (dlg.ShowDialog(this) == DialogResult.Cancel) cancelMessages = true;
dialogOpen = false;
}
這會甚至工作?這會導致其他不好的事情發生嗎? (這會阻止消息循環?)
我剛剛嘗試過循環,它阻止了一切。 (對話框不起作用。)我可能不得不建立一個消息隊列。 – teynon
爲什麼不只跟蹤完成後臺線程的數量與陳述的數量以及計數何時下降到0,那麼只有在出現消息框時才顯示消息框 – Franck
正在使用標準的'MessageBox'選項嗎?我測試了一下,那些按照你想要的方式工作。 –