我正在寻找一种方法让我的程序等待页面完全加载,然后再继续运行并在加载的文档上执行更多代码。
我没有找到任何好的方法来做到这一点,但我记得当我们使用MessageBox.Show("some string");
程序停止/等待(?)然后继续运行时,即使在循环中也是如此。
所以当我们有这个循环时:
for (int i = 0; i < 10; i++)
{
MessageBox.Show("i");
}
直到i++
我按下 OK 按钮才会运行。
他们是怎么做到的?
MessageBox.Show()
显示一个模态窗口。对 MessageBox.Show() 的调用会阻塞,直到用户关闭对话框。
编辑:是的,对话框不仅仅是.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())时,现在有一个方法会继续阻塞等待窗口关闭。
我希望这有帮助。
一般来说,微软库函数背后的代码没有公开,但这里有一些伪代码如何完成类似的事情
Show()
{
DisplayMessageBox();
while(Ok button is not pressed)
{
WaitAFewMilliseconds();
}
HideMessageBox();
}
还有其他范例,例如基于事件的输入。
现在这不会挂断其他一切的原因是因为多线程。假设您有 2 个线程同时运行。操作系统会在一个线程中运行几行,然后在另一个线程中运行几行,这样它们看起来是同时发生的。
现在,您的对话框可能与调用它的对话框在同一个线程中(这就是 i++ 不执行的原因),但是检测您的输入的任何内容都可以在不同的线程中。