如果我有类似while (true) Application.DoEvents();
的东西(它实际上并不完全相同),当我关闭主窗体时,程序会继续运行。如何让程序停止运行?是否有像'MustTerminate'
这样的变量我可以在我的while循环中查看以了解何时完成它?在现实生活中,循环正在等待加载网页。我可以放一个计时器,但我不希望程序在关闭表单时等待计时器停止运行。
答案 0 :(得分:2)
是的,这就是你总是得到建议而不是使用DoEvents()的原因。对于它允许运行什么样的事件,它是不分青红皂白的。不只是关闭表单,按下启动该循环的按钮也是一个令人讨厌的问题。
尽管如此,.NET中的代码已经在循环中使用了DoEvents()。 Form.ShowDialog()。它通过以下方式实现安全:
foreach (Form frm in Application.OpenForms) {
if (frm != dlg) frm.Enabled = false;
}
while (dlg.DialogResult != DialogResult.None) {
Application.DoEvents();
}
将Enabled属性设置为false是使其安全的原因。用户无法关闭表单或再次启动命令。
答案 1 :(得分:0)
添加一个布尔的MustTerminate属性,并在找到它时退出循环。 您可以将属性设置为True,以处理ApplicationExit事件。
答案 2 :(得分:0)
嵌套的消息循环非常棘手。它们具有不可思议的能力,可以创建非常难以重现的重入错误。这些错误通常会持续相当长的时间,直到出现意外情况(较旧的机器,内存分页或不同的操作系统),这些错误会在客户端计算机上自然地显示潜在的错误。
处理此类情况的最佳方法是处理操作完成时触发的事件。如果没有已定义的事件,您可以使用SynchronizationContext
类或其包装AsyncOperation
类创建自己的事件。有关更多详细信息,请参阅event-based asynchronous pattern上的MSDN文档。