'while(true)Application.DoEvents()'不知道程序何时完成

时间:2010-09-07 18:31:12

标签: c# .net

如果我有类似while (true) Application.DoEvents();的东西(它实际上并不完全相同),当我关闭主窗体时,程序会继续运行。如何让程序停止运行?是否有像'MustTerminate'这样的变量我可以在我的while循环中查看以了解何时完成它?在现实生活中,循环正在等待加载网页。我可以放一个计时器,但我不希望程序在关闭表单时等待计时器停止运行。

3 个答案:

答案 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文档。