我有一个应用程序在取消对话框时出现了奇怪的错误。如果该框被取消,应用程序将无法继续,因此它会退出,但由于某种原因它无法正常工作,因此它会继续运行并崩溃。
我调试了这个问题,不知怎的,应用程序运行在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窗体应用程序。
答案 0 :(得分:44)
这篇文章扩展了您正在经历的同一思路: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);
}
答案 1 :(得分:7)
最近遇到这个问题(Application.Exit无法使用Application.Run(new Form())正确终止win-forms的消息泵),我发现如果你正在生成新线程或启动后台工作者构造函数,这将阻止Application.Exit运行。
将所有'RunWorkerAsync'调用从构造函数移动到表单Load方法:
public Form()
{
this.Worker.RunWorkerAsync();
}
转到:
public void Form_Load(object sender, EventArgs e)
{
this.Worker.RunWorkerAsync();
}
答案 2 :(得分:6)
尝试Environment.Exit(exitCode)
。
答案 3 :(得分:3)
在很多情况下,我使用Thread.CurrentThread.Abort()
并且该过程已关闭。似乎Application.Exit没有与当前线程正确连接。
答案 4 :(得分:2)
还要确保应用程序中运行的所有线程都将IsBackground属性设置为true。非后台线程很容易阻止应用程序退出。
答案 5 :(得分:2)
确保没有Console.ReadLine();在您的应用和Environment.Exit(1);将工作并关闭您的应用程序。
答案 6 :(得分:1)
我创建了以下内容,可以在任何地方退出应用程序。您不必担心 Form 是否正在运行,测试会确定并调用适当的 Exit。
public void exit(int exitCode)
{
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(exitCode);
}
} //* end exit()
答案 7 :(得分:0)
此应用程序是否使用Main
运行(使用Application.Run()
方法)?否则,Application.Exit()
将无效。
如果您编写了自己的Main
方法并且想要停止该应用程序,则只能通过从Main
方法返回(或终止该过程)来停止。
答案 8 :(得分:0)
试试这个:
在Program.cs文件中:
Application.Run(new form());
添加 Application.Exit();