我正在寻找一种方法让我的程序等待页面完全加载,然后继续运行并在加载的文档上执行更多代码。
我没有找到任何好办法,但是我记得当我们使用MessageBox.Show("some string");
程序停止/等待(?)然后继续前进,即使是在循环中。
所以当我们有这个循环时:
for (int i = 0; i < 10; i++)
{
MessageBox.Show("i");
}
在我按下OK按钮之前,i++
将无法运行。
他们是如何做到的?
答案 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 ++没有执行),但无论检测到你的输入都可以在不同的线程中。