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

我已经用c#发布了一个应用程序。每当我通过单击红色退出按钮关闭主表单时,表单都会关闭,但不会关闭整个应用程序。当我试图关闭计算机时,我发现了这一点,随后我添加了大量带有MessageBox警报的子窗口。

我尝试了Application.Exit,但它仍然调用所有的子窗口和警报。我不知道如何使用Environment.Exit,也不知道将哪个整数放入其中。

此外,每当我的表单调用FormClosedFormClosing事件时,我都会用this.Hide()函数关闭应用程序;这会影响我的应用程序的行为吗?

728178 次浏览

从MSDN:

应用。退出< /强> < / >

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

环境。退出< /强> < / >

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

这篇文章,应用程序。退出vs.环境。退出,指向一个很好的提示:

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

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

参考:为什么应用程序。退出失败?

顺便说一下。每当我的窗体调用formclosed或窗体关闭事件时,我就用this.Hide()函数关闭应用程序。这会影响我的应用程序现在的行为吗?

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

如果你的整个应用程序总是在主窗体关闭时完全终止,那么你应该删除窗体关闭处理程序。通过不取消该事件,只是让他们形成关闭时,用户关闭它,你会得到你想要的行为。至于所有其他表单,如果你不打算再次显示表单的相同实例,你只需让它们关闭,而不是阻止关闭并隐藏它们。如果你要再次展示它们,那么把它们藏起来就可以了。

如果你想让用户为你的主表单点击“x”,但让另一个表单保持打开状态,实际上,成为“新的”主表单,那么这就有点复杂了。在这种情况下,你只需要隐藏你的主表单而不是关闭它,但是你需要添加某种机制,当你真的想要你的应用程序结束时,实际上将关闭主表单。如果这是你所处的情况,那么你需要在你的问题中添加更多细节,描述什么类型的应用程序应该和不应该真正结束程序。

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

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

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

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