MessageBox.Show如何使循环等待

时间:2012-11-05 19:03:20

标签: c# winforms

我正在寻找一种方法让我的程序等待页面完全加载,然后继续运行并在加载的文档上执行更多代码。

我没有找到任何好办法,但是我记得当我们使用MessageBox.Show("some string");程序停止/等待(?)然后继续前进,即使是在循环中。

所以当我们有这个循环时:

for (int i = 0; i < 10; i++)
{
    MessageBox.Show("i");
}

在我按下OK按钮之前,i++将无法运行。

他们是如何做到的?

3 个答案:

答案 0 :(得分:4)

MessageBox.Show()显示modal window。对MessageBox.Show()的调用将阻塞,直到用户解除对话框为止。

答案 1 :(得分:2)

编辑:是的,对话框不仅仅是.NET中的while循环。我只是尝试传达一个简单的解释,为什么MessageBox.Show阻止像问题创建者问。我修改了以下措辞以更好地适应。

如果您需要等待页面完全加载,则需要添加某种触发器以确定页面何时完成。

for (int i = 0; i < 10; i++)
{
     MessageBox.Show("i");
}

可以写成:

for(int i = 0; i < 10; i++)
{
    bool isRunning = true;
    while(isRunning)
    {
       isRunning = CheckIfSomethingIsStillRunning();
       Thread.Sleep(10);
    }
}

基本上,你必须保持循环,直到你认为你有必要继续你的线程/程序。

MessageBox.Show()阻止的原因是因为Windows实际上只是在while循环中运行,不断接收消息和绘画。当你显示一个Dialog(Window.ShowDialog(),MessageBox.Show())时,现在有一个方法继续阻止等待窗口关闭。

我希望这会有所帮助。

答案 2 :(得分:0)

一般来说,Microsoft库函数背后的代码没有公开,但是这里有一些psudocode如何实现类似的东西

Show()
{
    DisplayMessageBox();

    while(Ok button is not pressed)
    {
        WaitAFewMilliseconds();
    }
    HideMessageBox();
}

还有其他范例,就像基于事件的输入一样。

现在之所以不挂掉其他所有东西,是因为多线程。假设您有2个同时运行的线程。操作系统将运行一个线程的几行,然后运行另一个线程的几行,以便它们看起来同时发生。

现在,你的对话框可能与调用它的线程相同(这就是为什么i ++没有执行),但无论检测到你的输入都可以在不同的线程中。