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

时间:2009-02-16 20:12:43

标签: c# .net winforms

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

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

9 个答案:

答案 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();