WPF关闭应用汇总

原文:WPF关闭应用汇总

就本人而言,C#中关闭应用主要有以下途径:

1.Close():关闭当前窗口,可以在OnClosing和 OnClosed中捕获消息,在OnClosing的时候,可以取消关闭窗口

2.Application.Current.Shutdown()/App.Current.Shutdown(): 关闭当前程序,如果有其他线程没有结束,不会关闭

3.Environment.Exit(0):强制退出,即使有其他的线程没有结束

4.Process类的CloseMainWindow, Kill:Process.CloseMainWindow是GUI程序的最友好结束方式,从名字上就可以看出来它是通过结束主窗体,相当于用户点击窗体的关闭按钮或者按Alt + F4

5.Environment类的FailFast:这是最暴力最彻底最直接的方法,一般不建议使用

现对各方式做简单的介绍:

Close():如过调用了Close,而在Closing中没有显示的取消退出,则系统可以退出,这种情况仅仅是在没有多余线程,没有其他窗口启动的时候,如果有其他窗口同时启动,则要考虑App.Current.ShutdownMode。

Application.Current.Shutdown()/App.Current.Shutdown():其使用讲究最多。

在WPF应用程序的关闭是有ShutdownMode属性设置,具有3中枚举类型的值:
1)OnLastWindowClose(默认值)---应用程序最后一个窗体关闭时关闭应用程序
2)OnMainWindowClose---应用程序主窗体关闭时关闭应用程序
3)OnExplicitShutdown---显示调用关闭

示例如下:

<Application x:Class="TestApplication.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation%22
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml%22
StartupUri="Window1.xaml"
ShutdownMode="OnMainWindowClose">
</Application>

Environment.Exit(0):Environment.Exit相当于在Main函数中的return指令。不过它不会执行代码块的finally块(如果有的话),但资源清理还是要进行的。它是最常见的退出当前进程的方法之一。在Main函数中我们可以直接return语句便退出了程序。如果不在Main函数内,那么Environment.Exit方法就可以派上用场。

示例如下:

private void CloseApp() {
CloseSignal();
AppManager.Instance.Close();
Environment.Exit(0);
}

Environment类的FailFast:此方法更速度,它甚至不需要向操作系统返回进程退出代码(ExitCode),直接结束当前进程并在应用程序事件薄中写入信息,用于程序出现致命错误需要立即停止。


Process.Kill:从名字也可以看出来,直接杀掉,不给喘息喘息机会,Kill方法会直接结束整个进程,不进行常规资源清理(什么finally块等……)。Kill本质调用本地API:TerminateProcess函数。




参考:C#各种结束进程的方法详细介绍 

        WPF Application Shutdown Mode


上一篇:低功耗广域网络新一轮洗牌开始,NB-IoT/eMTC、LoRa成为最后赢家?


下一篇:bboss持久层开启和关闭自带主键机制