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

Joh*_*upe 178 c# exit winforms

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

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

Fur*_*dar 303

来自MSDN:

Application.Exit

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

Environment.Exit

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

这篇文章,Application.Exit与Environment.Exit,指向一个很好的提示:

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

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

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

  • 问题没有提到由于错误而退出,因此退出代码应该为零:`Environment.Exit(0)`任何非零值都是一个特定于应用程序的错误代码,可以由脚本使用采取适当的行动.(这是新代码和WinForms应用程序,因此在这种情况下不太可能很重要,但对编写命令行工具的人来说很有用.) (5认同)
  • 这对我来说真的很有用,因为我有一个 WinForms 应用程序,它有一个参数,所以它可以静默运行,因此不显示表单。当表单被隐藏时,“Application.Exit()”无法退出应用程序,但是“Environment.Exit(1)”就像一个魅力。 (3认同)
  • 如果我错了,请纠正我,但我认为之后的“return”语句会大大改进这种方法。据我了解,代码将在“Application.Exit()”之后继续执行,直到“return”语句为止。 (3认同)
  • `Environment.Exit` 也可以用于表单应用程序。 (2认同)

Sco*_*ain 16

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

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

IsBackgroundfalse它会保持你的程序中打开,直到线程完成,如果你设置IsBackgroundtrue线程将不会保持程序中打开.像BackgroundWoker,ThreadPoolTask所有内部使用IsBackground设置为的线程true.


小智 14

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

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

  • 它仅适用于控制台应用程序。 (2认同)

Ser*_*rvy 8

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

简而言之,是的.整个应用程序时的主要形式(形式经由开始将结束Application.RunMain方法)被关闭(不隐藏).

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

如果您希望能够让用户单击主窗体的"x",但让另一个窗体保持打开状态,并且实际上成为"新"主窗体,那么它会更复杂一些.在这种情况下,您需要隐藏主窗体而不是关闭它,但是您需要添加某种实际关闭主窗体的机制,当您真正希望您的应用程序结束时.如果您遇到这种情况,则需要在问题中添加更多详细信息,以描述应该和不应该实际结束程序的应用程序类型.


Tec*_*ft7 7

我会选择以下之一:

Application.Exit();

对于winform或

Environment.Exit(0);

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

谢谢!