Как ждать, пока диалог действительно не закроется - PullRequest
2 голосов
/ 03 мая 2019

Программное обеспечение запускает поток с некоторыми вычислениями, а затем показывает другое Form в виде диалогового окна ожидания с ShowDialog.Когда поток BackgroundWorker заканчивает свою работу, Form закрывается в событии RunWorkerCompleted, и другой расчет начинается с другого Form в качестве диалогового окна ожидания (снова с ShowDialog).

Проблема в том, что первое диалоговое окно ожидания остается видимым, пока второе диалоговое окно ожидания не будет закрыто.Как ждать отображения второго диалога после того, как первый диалог действительно закрыт?

Простой код для воспроизведения:

private BackgroundWorker _bgw = new BackgroundWorker();
private Form2 _msg = new Form2();
private Form3 _msg2 = new Form3();

public Form1()
{
    _bgw.DoWork += BgwDoWork;
    _bgw.RunWorkerCompleted += BgwRunWorkerCompleted;
    _bgw.RunWorkerAsync();
    _msg.ShowDialog();
}

private void BgwDoWork(object sender, DoWorkEventArgs e)
{
    System.Threading.Thread.Sleep(5000);
}

private void BgwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    _msg.Close();
    _msg2.ShowDialog();
}

1 Ответ

4 голосов
/ 03 мая 2019

Обратите внимание, что ShowDialog () является блокирующим вызовом. Вы все еще не вернулись из конструктора, когда показывали _msg2.

Это быстрое решение:

public Form1()
{
    _bgw.DoWork += BgwDoWork;
    _bgw.RunWorkerCompleted += BgwRunWorkerCompleted;
    _bgw.RunWorkerAsync();
    _msg.ShowDialog();
    _msg2.ShowDialog();   // here
}

private void BgwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    _msg.Close();
    //_msg2.ShowDialog();  // not here
}
...