C# 如何显示MessageBox.Show使循环等待

C# 如何显示MessageBox.Show使循环等待,c#,winforms,C#,Winforms,我正在寻找一种方法,使我的程序在页面继续运行并在加载的文档上执行更多代码之前,等待页面完全加载 我没有找到任何好的方法,但我记得当我们使用MessageBox.Show(“一些字符串”)程序停止/等待(?)然后继续运行,即使在循环中也是如此 所以当我们有了这个循环: for (int i = 0; i < 10; i++) { MessageBox.Show("i"); } for(int i=0;i

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

我没有找到任何好的方法,但我记得当我们使用
MessageBox.Show(“一些字符串”)程序停止/等待(?)然后继续运行,即使在循环中也是如此

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

for (int i = 0; i < 10; i++)
{
    MessageBox.Show("i");
}
for(int i=0;i<10;i++)
{
MessageBox.Show(“i”);
}
在我按下OK按钮之前,
i++
将不会运行


他们是如何做到这一点的?

MessageBox.Show()
。对MessageBox.Show()的调用会一直阻塞,直到用户关闭对话框。

一般来说,Microsoft库函数背后的代码不会公开,但下面是一些psudocode,可以用来完成类似的任务

Show()
{
    DisplayMessageBox();

    while(Ok button is not pressed)
    {
        WaitAFewMilliseconds();
    }
    HideMessageBox();
}
还有其他范例,比如基于事件的输入

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


现在,您的对话框可能与调用它的线程位于同一个线程中(这就是为什么i++没有执行),但是检测到您的输入的任何东西都可以位于不同的线程中

编辑:是的,对话框不仅仅是.NET中的while循环。我只是想简单地解释一下为什么MessageBox.ShowBlock会像创建者所问的问题一样。我修改了下面的措词,以便更合适

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

for (int i = 0; i < 10; i++)
{
     MessageBox.Show("i");
}
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);
    }
}
for(int i=0;i<10;i++)
{
bool isRunning=true;
同时(正在运行)
{
isRunning=checkifsomethingistillrunning();
睡眠(10);
}
}
基本上,您必须保持一个循环,直到您认为有必要让您的线程/程序继续

MessageBox.Show()之所以会阻塞,是因为Windows实际上只是在一个while循环中运行,不断地接收消息和绘制。当您显示一个对话框(Window.ShowDialog()、MessageBox.show())时,现在有一个方法会继续阻塞,等待窗口关闭


我希望这能有所帮助。

+0,我不认为这就是op所要问的。那么为什么它是问题中如此突出的一部分呢?@samy:模态对话框就是这样工作的。但有人会让这一切发生。我的意思是,他们怎么让程序等着呢。(发生这种情况的代码)当您调用
MessageBox.Show()
时,该方法在用户单击“确定”或“取消”之前不会
返回
。您是否有多次踩踏的经验?有一点,但这不是停止主线程吗?如果您想等待/停止,您需要知道等待多长时间。您想等待固定的时间吗。是否要等到某个特定事件发生(如果是,是什么),如果要等到另一个任务/线程/进程完成,则需要详细说明等待的内容,因为它可能会因上下文的不同而有很大差异。还要注意的是,您可能不想等待任何事情,您可能只想在异步操作完成时运行一些代码,而不是实际阻塞当前线程。该方法的名称选错了,他们应该将其称为“ShowDialog”@HansPassant我想情态隐含在
消息框中。但是我同意,它与用于显示
表单的方法不一致
现在之所以没有挂断其他所有内容,是因为多线程
现在这是不正确的。模式弹出窗口根本不使用其他线程或其他同步上下文。它只是使用DoEvents来避免阻塞UI。两个关键点是开头的“禁用父窗体”和底部的“启用父窗体”。哦,虽然这有点有趣,但他根本不想解决他的程序。他几乎肯定想依赖于向异步任务添加一个延续,或者等待该任务提供的句柄,或者其他类似的东西。这很有趣,现在我有点困惑,因为我读了servy添加到他的评论中的链接,回答的人说:“ShowDialog()。它是DoEvents()这允许对话框处于模态,而不会冻结应用程序中的其余窗口。“但是如果我使用Thread.Sleep(10),它将释放所有应用程序,对吗?对不起,是的,这不仅仅是一个while循环。我更倾向于用一种简单的方式来解释它。线程。睡眠将仅暂停该线程的线程。已调用睡眠。因此,如果它在你的主线程中,那么整个应用程序都会暂停,但是如果你正在使用另一个线程来处理这个过程,那么只有那个线程会暂停。