为什么Application.Exit无法正常工作?

我有一个应用程序,取消对话框时出现奇怪的错误。 如果该框被取消,应用程序将无法继续,因此它将退出,但由于某种原因它无法正常工作,因此它会继续运行并崩溃。

我调试了这个问题,不知怎的,应用程序运行在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)

在很多情况下,我使用了Thread.CurrentThread.Abort()

并且该过程已关闭。 似乎Application.Exit没有正确连接当前线程。

还要确保应用程序中运行的所有线程都将IsBackground属性设置为true。 非后台线程很容易阻止应用程序退出。

确保没有Console.ReadLine(); 在您的应用和Environment.Exit(1); 将工作并关闭您的应用程序。

此应用程序是否使用Application.Run()运行(在Main方法中Application.Run() ? 否则, Application.Exit()将无法正常工作。

如果您编写了自己的Main方法并且想要停止应用程序,则只能通过从Main方法返回(或终止进程)来停止。

试试这个 :

在Program.cs文件中:

Application.Run之后(new form());

添加Application.Exit();