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

Posted

技术标签:

【中文标题】退出 .NET 应用程序的通用方法【英文标题】:Generic way to exit a .NET application 【发布时间】:2011-06-12 17:56:58 【问题描述】:

我了解有几种方法可以退出应用程序,例如 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 时,有不同的退出方式......我的问题是:

如何优雅地退出以涵盖所有应用程序类型?

【问题讨论】:

你不能简单地抛出一个异常而不是做明显的断言吗? 【参考方案1】:

阅读这篇文章,了解使用环境和应用程序之间的区别:

Application.Exit Vs 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 应用程序? WPF 应用程序通常使用 .Run() 命令启动(是)【参考方案2】:

如果只是中止,请使用Environment.Exit()。如果这是非常关键的事情(无法处理任何类型的清理),请使用Environment.FailFast()

【讨论】:

【参考方案3】:

我建议使用基本的异常处理,所以不要 System.Environment.Exit(1) throw new ApplicationException(message) 将异常冒泡到 main 方法,在你的情况下是这样的:

try
Application.Run(new MyForm());

catch(ApplicationException)
// do custom cleanup/reporting

只要确保你从主线程抛出异常,否则在抛出之前调用它

【讨论】:

在我上次使用 winforms 之前的一段时间,所以不确定调用是否正确,但至少你明白了,也看看例外

以上是关于退出 .NET 应用程序的通用方法的主要内容,如果未能解决你的问题,请参考以下文章

在 asp .net 核心中为 MediatR 库的发送和发布方法添加通用处理程序

asp.net 通用方法放在那里?

.NET 通用多条件动态参数查询方法

克隆/深度复制 .NET 通用 Dictionary<string, T> 的最佳方法是啥?

是否有一个 .Net C# 分析器可以报告通用方法的不同类型执行的单独统计信息?

苹果手机怎么返回和退出程序