233

我有一个用 C# 发布的应用程序。这里的问题是每当我通过单击红色退出按钮关闭主表单时,它会关闭表单但不会关闭应用程序。当我尝试关闭计算机时,我发现了这一点,希望我制作的应用程序运行顺利,然后我被许多我放置MessageBox警报的子窗口轰炸了。

我试过Application.Exit了,但它仍然调用所有子窗口和警报,我不知道如何使用Environment.Exit以及放入哪个整数。

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

4

4 回答 4

403

来自 MSDN:

应用程序.退出

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

环境.退出

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

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

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

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

参考:为什么 Application.Exit 不能工作?

于 2012-10-19T15:56:42.830 回答
18

我知道这不是您遇到的问题,但是可能发生这种情况的另一个原因是您在应用程序中打开了一个非后台线程。

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将不会保持程序打开。像BackgroundWoker,ThreadPoolTask所有内部使用IsBackground设置为的线程true

于 2013-10-08T21:18:18.397 回答
9

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

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

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

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

于 2012-10-19T16:51:12.587 回答
-3

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

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}
于 2018-05-07T15:13:23.513 回答