c# - 如何等到对话框真正关闭

标签 c# multithreading winforms user-interface showdialog

软件启动线程进行一些计算,然后使用 ShowDialog 显示另一个 Form 作为等待对话框。当 BackgroundWorker 线程完成其工作时,FormRunWorkerCompleted 事件中关闭,并使用另一个 Form 开始另一个计算code> 作为等待对话框(再次使用 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();
}

最佳答案

请注意,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
}

关于c# - 如何等到对话框真正关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55970268/

相关文章:

c# - 如何正确杀死Linux C#

java - Java 执行器中无界队列的用例是什么?

c# - Show 和 ShowDialog 将不起作用

c# - 无法通过c#删除.exe文件

c# - 为什么 azure 搜索会抛出 IndexBatchException 而 IndexingResults 中没有失败

c# - 如何使用按键来运行方法?

c - strcmp 是线程安全的吗?

c# - 在 C# 中使用生成缩略图

c# winforms toolstripmenuitem 更改背景

c# - 仅带有 getter 的属性与带有 getter 和私有(private) setter 的属性