我有一个应用程序,取消对话框时出现奇怪的错误.如果该框被取消,则该应用程序无法继续,因此它会退出,但由于某种原因它无法正常工作,因此它会继续运行并崩溃.
我调试了这个问题,不知怎的,应用程序运行在Application.Exit调用之后.我正在调试模式下运行,这是相关的,因为少量代码依赖于定义的RELEASE变量.这是我的应用退出代码.我已经跟踪了代码并且它进入了ExitApp方法,并继续运行,将控制权返回给调用者并最终崩溃.
这是一个通过远程桌面连接提供报告的应用程序,这就是退出代码有点奇怪的原因.它试图终止远程会话,但只有在发布时运行,因为我不想在每次测试运行时关闭我的开发机器.
private void ExitApp() { HardTerminalExit(); Application.Exit(); } // When in Debug mode running on a development computer, this will not run to avoid shutting down the dev computer // When in release mode the Remote Connection or other computer this is run on will be shut down. [Conditional("RELEASE")] private void HardTerminalExit() { WTSLogoffSession(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, false); }
我在Application.Exit行之后运行了一个调试器,没有任何反应,然后控制在我跳过该行后返回调用者.
这是怎么回事?这是一个Windows窗体应用程序.
这篇文章扩展了您正在经历的同一思路:http://www.dev102.com/2008/06/24/how-do-you-exit-your-net-application/
基本上:
Environment.Exit - 来自MSDN:终止此进程并为底层操作系统提供指定的退出代码.这是使用控制台应用程序时要调用的代码.
Application.Exit - 来自MSDN:通知所有消息泵必须终止,然后在处理完消息后关闭所有应用程序窗口.如果您已调用Application.Run(WinForms应用程序),则此代码将使用此方法,此方法将停止所有线程上的所有正在运行的消息循环并关闭应用程序的所有窗口.关于此方法还有一些问题,请在MSDN页面中阅读.
对此的另一种讨论:http://geekswithblogs.net/mtreadwell/archive/2004/06/06/6123.aspx
本文指出了一个很好的提示:
您可以通过检查System.Windows.Forms.Application.MessageLoop属性来确定是否已调用System.Windows.Forms.Application.Run.如果为true,则调用Run,您可以假设WinForms应用程序正在执行如下.
if (System.Windows.Forms.Application.MessageLoop) { // Use this since we are a WinForms app System.Windows.Forms.Application.Exit(); } else { // Use this since we are a console app System.Environment.Exit(1); }
最近遇到这个问题(Application.Exit无法使用Application.Run(new Form())正确终止win-forms的消息泵),我发现如果你在构造函数中生成新线程或启动后台worker,这将阻止Application.Exit运行.
将所有'RunWorkerAsync'调用从构造函数移动到表单Load方法:
public Form() { this.Worker.RunWorkerAsync(); }
搬去:
public void Form_Load(object sender, EventArgs e) { this.Worker.RunWorkerAsync(); }
试试Environment.Exit(exitCode)
.