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

3yhwsihp  于 2023-04-12  发布在  C#
关注(0)|答案(5)|浏览(189)

我有一个用C#发布的应用程序。每当我通过点击红色退出按钮关闭主窗体时,窗体关闭,但不是整个应用程序。当我试图关闭计算机时,我发现了这一点,随后被大量的子窗口轰炸,我添加了MessageBox警报。
我试过Application.Exit,但它仍然调用所有的子窗口和警报。我不知道如何使用Environment.Exit,也不知道该放哪个整数进去。
此外,每当我的窗体调用FormClosedFormClosing事件时,我都会使用this.Hide()函数关闭应用程序;这会影响我的应用程序的行为吗?

7gcisfzg

7gcisfzg1#

来自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?

h7wcgrx3

h7wcgrx32#

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

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的线程。

fquxozlt

fquxozlt3#

顺便说一下,每当我的窗体调用formclosed或窗体关闭事件时,我都用一个this.Hide()函数关闭应用程序。这会影响我的应用程序现在的行为吗?
当主窗体(通过Main方法中的Application.Run启动的窗体)关闭(不隐藏)时,整个应用程序将结束。
如果你的整个应用程序总是在主窗体关闭时完全终止,那么你应该删除窗体关闭处理程序。通过不取消该事件,并在用户关闭窗体时让它们关闭,你将获得所需的行为。至于所有其他窗体,如果你不打算再次显示窗体的相同示例,你只需让它们关闭即可。而不是阻止关闭和隐藏它们。如果你是再次显示它们,那么隐藏它们可能是好的。
如果你想让用户点击主窗体的“x”,但另一个窗体保持打开状态,实际上成为“新的”主窗体,那么就有点复杂了。在这种情况下,你只需要隐藏主窗体,而不是关闭它。但是你需要添加某种机制,当你真的希望你的应用程序结束时,它会关闭主窗体。我需要在你的问题中添加更多的细节,描述什么类型的应用程序应该和不应该实际结束程序。

yzuktlbb

yzuktlbb4#

就用

this.Close();

System.Environment.Exit(1);
ac1kyiln

ac1kyiln5#

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

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

相关问题