2011-01-20 17 views
21

据我所知,有几个方法可以退出应用程序,如Application.Exit(),Application.ExitThread(),Environment.Exit()等通用的方式退出.NET应用程序

我有一个外部的“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

难道你不能简单地抛出一个异常,而不是做显然是断言? – 2011-01-20 20:49:00

回答

25

阅读这篇关于使用环境和应用程序之间的区别:

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); 
} 
+0

这也是WPF应用程序的帐号吗? – michael 2011-01-20 20:55:40

+0

WPF应用程序通常以.Run()命令启动(是) – 2011-01-20 21:00:54

0

我会建议使用基本的异常处理,所以而不是System.Environment.Exit(1)抛出新的ApplicationException(消息),这种异常向主方法冒泡,在你的情况下是这样的:

try{ 
Application.Run(new MyForm()); 
} 
catch(ApplicationException){ 
// do custom cleanup/reporting 
} 

只要确保你在主线程抛出异常,否则调用它扔ofcourse

2

之前,如果它只是一个中断,使用Environment.Exit()。如果它非常重要(无法处理任何清理),请使用Environment.FailFast()