2

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

我没有找到任何好的方法来做到这一点,但我记得当我们使用MessageBox.Show("some string");程序停止/等待(?)然后继续运行时,即使在循环中也是如此。

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

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

直到i++我按下 OK 按钮才会运行。

他们是怎么做到的?

4

3 回答 3

4

MessageBox.Show()显示一个模态窗口。对 MessageBox.Show() 的调用会阻塞,直到用户关闭对话框。

于 2012-11-05T19:05:32.233 回答
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循环中运行,不断地接收消息和绘画。当您显示一个对话框(Window.ShowDialog()、MessageBox.Show())时,现在有一个方法会继续阻塞等待窗口关闭。

我希望这有帮助。

于 2012-11-05T19:23:40.853 回答
0

一般来说,微软库函数背后的代码没有公开,但这里有一些伪代码如何完成类似的事情

Show()
{
    DisplayMessageBox();

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

还有其他范例,例如基于事件的输入。

现在这不会挂断其他一切的原因是因为多线程。假设您有 2 个线程同时运行。操作系统会在一个线程中运行几行,然后在另一个线程中运行几行,这样它们看起来是同时发生的。

现在,您的对话框可能与调用它的对话框在同一个线程中(这就是 i++ 不执行的原因),但是检测您的输入的任何内容都可以在不同的线程中。

于 2012-11-05T19:13:11.667 回答