如何正确地退出一个C#应用程序?
我有一个在C#中发布的应用程序。 这里的问题是每当我通过点击红色退出buttonclosures主窗体,它closures窗体,但它不closures应用程序。 当我尝试closures计算机时发现了这一点,希望我所做的应用程序能够顺畅地运行,然后我被许多子窗口轰炸,我已经把它放在MessageBox Alerts中。
我尝试了Application.Exit,但它仍然调用所有的子窗口和警报,我不知道如何使用Environment.Exit和哪个整数放入它。 顺便说一句,每当我的窗体调用formclosed或窗体closures事件,我用一个this.Hide()
函数closures应用程序。 这会影响我的应用程序现在的行为吗?
来自MSDN:
Application.Exit
通知所有消息泵必须终止,然后在处理消息之后closures所有应用程序窗口。 如果您调用了Application.Run(WinForms应用程序),则这是要使用的代码,此方法将停止所有线程上正在运行的消息循环,并closures应用程序的所有窗口。
Environment.Exit
终止此过程,并为底层操作系统提供指定的退出代码。 这是您使用控制台应用程序时要调用的代码。
这篇文章, Application.Exit vs. Environment.Exit ,指出了一个好的提示:
您可以通过检查System.Windows.Forms.Application.MessageLoop
属性来确定是否调用了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); }
参考: 为什么Application.Exit不能正常工作?
我知道这不是你所遇到的问题,但是另一个可能发生的原因是你在应用程序中打开了一个非后台线程。
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); } } } }
当IsBackground
为false
,程序一直处于打开状态直到线程完成,如果将IsBackground
设置为true
,线程将不会保持程序打开。 诸如BackgroundWoker
, ThreadPool
和Task
都在内部使用一个IsBackground
设置为true
的线程。
所有你需要的是System.Environment.Exit(1);
它使用系统命名空间“使用系统”,几乎总是在那里,当你开始一个项目。
顺便一提。 每当我的表单调用formclosed或表单closures事件时,我都用this.Hide()函数closures应用程序。 这会影响我的应用程序现在的行为吗?
总之,是的。 当主窗体(通过Main
方法中的Application.Run
启动的窗体)closures(不隐藏)时,整个应用程序将结束。
如果您的整个应用程序应该总是完全终止,只要您的主窗体closures,那么你应该删除该窗体closures的处理程序。 通过不取消该事件,并让用户closures它时让它们形成紧密关系,您将获得所需的行为。 至于所有其他forms,如果你不打算再次显示同样的forms的实例,你只是让他们closures,而不是阻止closures和隐藏它们。 如果你再次展示他们,那么隐藏他们可能会很好。
如果你想让用户点击你的主窗体的“x”,而另一个窗体保持打开状态,并且实际上变成了“新”的主窗体,那么它会更复杂一些。 在这种情况下,您将需要隐藏主窗体而不是closures窗体,但是您需要添加某种机制,当您真的希望自己的应用程序结束时, 实际上会closures主窗体。 如果这是你的情况,那么你需要在你的问题中添加更多的细节来描述什么types的应用程序应该而不应该实际结束程序。
你做:
Application.Run(myForm);
在你的主要()?
我发现这是一个非常简单的方法来closures表单时closures应用程序。
Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error