.NET应用程序通用的退出方式

33

我知道有几种方法可以退出应用程序,比如Application.Exit()、Application.ExitThread()、Environment.Exit()等。

我有一个外部的"commons"库,我正在尝试创建一个通用的FailIf方法,将故障记录到日志中,做这个、那个和另外一些操作,最后退出应用程序......以下是它的简短版本。

    public static void FailIf(Boolean fail, String message, Int32 exitCode = 1)
    {
        if (String.IsNullOrEmpty(message))
            throw new ArgumentNullException("message");

        if (fail)
        {
            //Do whatever I need to do

            //Currently Environment.Exit(exitCode)
            Environment.Exit(exitCode);
        }
    }

我已经了解了使用 Environment.Exit 不是处理 WinForm 应用程序的最佳方式,而且在处理 WPF 应用程序和 Silverlight 时也有不同的退出方式... 我的问题真正是:

为了涵盖所有应用程序类型,我该使用什么方法来优雅地退出?


3
你能否只抛出一个异常而不是显然是一个断言呢? - Etienne de Martel
3个回答

40

阅读有关使用Environment和Application之间差异的内容:

Application.Exit与Environment.Exit

该页面底部有你想要做的示例。

if (System.Windows.Forms.Application.MessageLoop)
{
  // Use this since we are a WinForms app
  System.Windows.Forms.Application.Exit();
}
else
{
  // Use this since we are a console app
  System.Environment.Exit(1);
}

这也适用于WPF应用程序吗? - michael
WPF应用程序通常使用.Run()命令启动(是的) - Yochai Timmer
Geekswithblogs.net网站已经消失了。 - Sam Hobbs

3
如果只是一个中止,使用 Environment.Exit()。如果是非常关键的情况(无法处理任何清理操作),则使用 Environment.FailFast()

0
我建议使用基本的异常处理,所以不要使用System.Environment.Exit(1),而是抛出一个新的ApplicationException(message)异常,这样可以将异常传递到主方法中,例如在你的情况下:
try{
Application.Run(new MyForm());
}
catch(ApplicationException){
// do custom cleanup/reporting
}

只需确保您从主线程抛出异常,否则在抛出之前调用它即可。


之前我使用过WinForms,所以不确定调用是否正确,但至少你能理解我的意思。同时请注意异常处理。 - Polity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接