首页 文章

如何正确退出C#应用程序?

提问于
浏览
143

我在C#中发布了一个应用程序 . 这里的问题是每当我通过单击红色退出按钮关闭主窗体时,它会关闭窗体,但它不会关闭应用程序 . 当我尝试关闭计算机时,我发现了这一点,希望我制作的应用程序运行顺畅,然后我被很多子窗口轰炸,我已经将MessageBox Alerts放入其中 .

我尝试了Application.Exit,但它仍然调用所有子窗口和警报,我不知道如何使用Environment.Exit和哪个整数放入其中 . 顺便说一下,每当我的表单调用formclosed或form closing事件时,我都会使用 this.Hide() 函数关闭应用程序 . 这会影响我的应用程序现在的行为吗?

8 回答

  • 258

    来自MSDN:

    Application.Exit

    通知所有消息泵必须终止,然后在处理完消息后关闭所有应用程序窗口 . 如果您已调用Application.Run(WinForms应用程序),则此代码将使用此方法,此方法将停止所有线程上的所有正在运行的消息循环并关闭应用程序的所有窗口 .

    Environment.Exit

    终止此过程并为底层操作系统提供指定的退出代码 . 这是使用控制台应用程序时要调用的代码 .

    这篇文章Application.Exit vs. Environment.Exit指出了一个很好的提示:

    您可以通过检查 System.Windows.Forms.Application.MessageLoop 属性来确定是否已调用 System.Windows.Forms.Application.Run . 如果为true,则调用Run,您可以假设WinForms应用程序正在执行如下 .

    if (System.Windows.Forms.Application.MessageLoop) 
    {
        // WinForms app
        System.Windows.Forms.Application.Exit();
    }
    else
    {
        // Console app
        System.Environment.Exit(1);
    }
    

    参考:Why would Application.Exit fail to work?

  • 7

    我知道这不是你遇到的问题,但是这可能发生的另一个原因是你的应用程序中有一个非后台线程 .

    using System;
    using System.Threading;
    using System.Windows.Forms;
    
    namespace Sandbox_Form
    {
        static class Program
        {
            private static Thread thread;
    
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                thread = new Thread(BusyWorkThread);
                thread.IsBackground = false;
                thread.Start();
    
                Application.Run(new Form());
    
            }
    
            public static void BusyWorkThread()
            {
                while (true)
                {
                    Thread.Sleep(1000);
                }
            }
        }
    }
    

    IsBackgroundfalse 时,它将保持程序打开直到线程完成,如果将 IsBackground 设置为 true ,则线程将不会保持程序打开 . 像 BackgroundWokerThreadPoolTask 这样的内部都在内部使用 IsBackground 设置为 true 的线程 .

  • 11

    所有你需要的是 System.Environment.Exit(1);

    它使用系统名称空间“使用系统”,当你启动项目时,它几乎总是存在 .

  • 2

    顺便说一下 . 每当我的表单调用formclosed或form closing事件时,我都会使用this.Hide()函数关闭applciation . 这会影响我的应用程序现在的行为吗?

    简而言之,是的 . 当主窗体(通过 Main 方法中的 Application.Run 启动的窗体)关闭(未隐藏)时,整个应用程序将结束 .

    如果您的整个应用程序应该在主窗体关闭时始终完全终止,那么您应该只删除该窗体关闭的处理程序 . 通过不取消该事件并在用户关闭它时让它们形成关闭,您将获得所需的行为 . 对于所有其他表单,如果您不打算再次显示该表单的相同实例,只需让它们关闭,而不是阻止关闭并隐藏它们 . 如果你再次展示它们,那么隐藏它们可能没问题 .

    如果您希望能够让用户单击主表单的"x",但是另一个表单保持打开状态,并且实际上成为"new"主表单,那么's a bit more complicated. In such a case you will need to just hide your main form rather than closing it, but you'll需要添加某种实际的机制当你真的希望你的应用程序结束时关闭主窗体 . 如果出现这种情况,您需要在问题中添加更多详细信息,以描述应该和不应该实际结束程序的应用程序类型 .

  • -1

    你做的:

    Application.Run(myForm);
    

    在你的主()?

    我发现在表单关闭时很容易杀死应用程序 .

  • 14

    我要么是下列之一:

    Application.Exit();

    对于winform或

    Environment.Exit(0);

    用于控制台应用程序(也适用于winforms) .

    谢谢!

  • 1
    Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error
    
  • -2

    在这种情况下,退出应用程序以覆盖App.xaml.cs中的onExit()方法的最正确方法:

    protected override void OnExit(ExitEventArgs e) {
        base.OnExit(e); 
    }
    

相关问题