gpt4 book ai didi

c# - MessageBoxes 什么时候不模态运行?

转载 作者:行者123 更新时间:2023-11-30 20:23:34 25 4
gpt4 key购买 nike

我一直认为 MessageBoxes 有点像断点——它们会阻止程序执行,直到用户单击“确定”。但是,我刚刚发现这是不准确的,我正试图弄清楚 MessageBoxes 何时会和不会停止执行。

通过 SO(成功)搜索问题的解决方案,我发现了这个伪代码:

if (somethingHappened())
{
timer1.Enabled = false;
MessageBox.Show("something happened");
}
else continue with other stuff ...

行为与此不同:

if (somethingHappened())
{
MessageBox.Show("something happened");
timer1.Enabled = false;
}
else continue with other stuff ...

在第一种情况下,计时器停止并显示消息框。在第二种情况下,显示消息框但计时器没有停止。该程序只是继续其他事情。显然,必须在计时器停止之前单击 MessageBox,但我的程序一直在继续。 (再次调用了事件处理器,又出现了一个MessageBox,陷入死循环。)

那么,在什么情况下 MessageBox 不是是真正的模态的,在用户响应之前无法停止程序的执行?

最佳答案

消息框是模态的。但是为了为其 GUI 提供服务,它运行所谓的模态消息循环。该消息循环拉动调度同步消息,还处理异步消息。像 WM_TIMER。后一个事实意味着您的计时器会继续计时。

您调用 MessageBox.Show 并且直到对话框关闭才真正返回。但在 MessageBox.Show 内部是一个处理消息的循环。该消息处理的一部分涉及调用您的计时器事件。由于非终止递归,这很可能导致堆栈溢出。而这正是发生在你身上的事情。

要摆脱这一点的关键是 MessageBox.Show 调度计时器事件(以及其他事件),这可能导致重新进入。

关于c# - MessageBoxes 什么时候不模态运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28662887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com