【发布时间】:2016-06-06 10:55:00
【问题描述】:
using System.Windows.Forms;
public class App
{
[STAThread]
public static void Main()
{
string fname;
using (var d = new OpenFileDialog())
{
if (d.ShowDialog() != DialogResult.OK)
{
return;
}
fname = d.FileName;
}
//Application.ExitThread();
for (; ;)
;
}
}
上面的代码显示了一个文件对话框。一旦我选择了一个文件并按下open,for 循环就会执行,但(冻结的)对话框仍然存在。
一旦我取消注释Application.ExitThread(),对话框就会按预期消失。
这是否按预期工作?为什么using 不让窗口消失?在哪里可以找到有关此的更多信息?
【问题讨论】:
-
我已经测试了您的代码,(文件打开)对话框按预期正确关闭。
-
处理完后调用
Application.DoEvents(),对话框会消失吗? -
没有人会从那个 sn-p 重现你的问题。在一个 GUI 应用程序中,永远不要用任何像 for(;;); 这样的暂停和捕获代码来挂起主线程,这一点至关重要。很多事情都停止了,尤其是绘画不再发生。因此,窗口中的任何像素都无法更新,您可能会看到窗口顶部显示的任何内容的幻影。花时间读一本像样的教程或书籍,如何正确编写 GUI 代码很少通过反复试验发现。
-
考虑诊断。您的代码不需要调用 DoEvents()。
-
您应该在问题中提到这一点。无论如何,它不会改变问题。 single-threaded apartment (STA) thread 需要有一个消息循环。只要它在屏幕上,对话框就会通过
ShowDialog方法在内部运行一个。但是一旦用户关闭它,消息循环就会消失。没有人再泵送消息,违反 STA 线程的条件。事实上,您的应用程序已经变得愚蠢,因为它被锁定在一个紧密的无限循环中。
标签: c# .net winforms dialog mono