web-dev-qa-db-ja.com

.NETアプリケーションを終了する一般的な方法

Application.Exit()、Application.ExitThread()、Environment.Exit()など、アプリケーションを終了する方法がいくつかあることを理解しています。

私は外部の「コモンズ」ライブラリを持っていて、失敗をログに記録する汎用の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を操作するときに、さまざまな方法で終了することを読んだことがあります...私の質問は本当に:

すべてのアプリケーションタイプをカバーするために、何をすれば正常に終了できますか?

23
michael

環境とアプリケーションの違いについては、こちらをご覧ください。

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);
}
31
Yochai Timmer

単に中止する場合は、Environment.Exit()を使用します。それが非常に重要なものである場合(どのような種類のクリーンアップも処理できない場合)、Environment.FailFast()を使用します。

3
user541686

基本的な例外処理を使用することをお勧めします。そのため、System.Environment.Exit(1)の代わりに、新しいApplicationException(message)をスローして、メインメソッドへの例外をバブルアップします。

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

メインスレッドから例外をスローすることを確認してください。そうでない場合は、コースをスローする前にそれを呼び出してください。

0
Polity