web-dev-qa-db-ja.com

Environment.Exitを使用してコンソールアプリケーションを終了するのはいつですか?

私は職場で多くのコンソールアプリケーションを保守していますが、それらの多くで気付いていることの1つは、Environment.Exit(0)を呼び出すことです。

サンプルプログラムは次のようになります。

public class Program
{
    public static void Main(string[] args)
    {
        DoStuff();
        Environment.Exit(0);
    }
}

私は元のプログラマの意図がこれをやっていることを理解していませんか? Environment.Exitステートメントがなくても、プログラムは正常に終了するはずです。とはいえ、これらのプログラムの1つでは、閉じられるはずだったのにコンソールウィンドウが残っているので、そこで何が起こっているのか本当にわかりません。

ここに何かが足りませんか?または、このインスタンスでEnvironment.Exitを呼び出す必要がある理由はありますか?

33
mezoid

Mainメソッドの最後の行としてExit()を呼び出す唯一の理由は、他のフォアグラウンドスレッドが実行されている可能性がある場合です。実行がMainの終わりから落ちた場合、それらは実行されたままになります。この場合でも、通常、他のスレッドに明示的なグレースフルターミネーションを入れるか、またはバックグラウンドスレッドから開始することをお勧めします。

Mainから別の終了コードを返したい場合、それを達成するためのより簡単な方法は、intを返すように宣言することです。

要するに、ここでEnvironment.Exit()が必要だとは思わない。同僚にそれをなぜ使用しているのかを正確に尋ねる価値はある。もう少し毛羽を切ります。

53
Jon Skeet

基本的に、ステートメントEnvironment.Exit(0)は、これが「クリーンな」出口であることをオペレーティングシステムに伝えます。 Environment.Exit(1)のような異なる意味を持つ他の数字もあります

ただし、「Main」は「void」を何も返さないと宣言されているため、終了コードには意味がありません。

さまざまな終了コードについて詳しく知りたい場合は、こちらをご覧ください

システムエラーコード

15
Anand Shah

これは、基礎となるシェルの成功または失敗を示すコマンドラインプログラムの[互換性]であり、メイン関数のプロトタイプがあった古いCスタイルのメインループから継承されます。

_int main(void);

int main(int argc, char *argv[]);
_

戻り値0は伝統的に成功を意味し、ゼロ以外はプログラマーが決定したものに応じて失敗または何か他のものを意味していました。

参照

wikimain関数の詳細について。

MSDNドキュメント on Environment.Exit()

Environment.Exit():このプロセスを終了し、基礎となるオペレーティングシステムに指定された終了コードを提供します。

3
Robert Paulson

これは、他のアプリケーションがコンソールアプリの結果を待っているときに本当に使用されます。たとえば、SSRS(ツール)はコンソールアプリを起動し、失敗応答の成功を取得するのを待ちます。 Environment.Exit(0)は、成功した実行メッセージを送り返します。

0
Yongil

SSISでプロセス実行タスクがあり、プロセスが失敗したかどうかを知りたい場合、この方法は便利です。

0
Farshid

.netコアでは、現在のところ、Environment.Exit Macでプログラムを終了します。 mainから純粋に戻ってもプロセスは停止せず、ユーザーが中止するまで実行され続けます。次のようなパターン:

public class Program
{
    public static void Main(string[] args)
    {
        Environment.Exit(TryRun(args));
    }
}

windowsとMacの両方に出荷したいので、私の職場では一般的です。

0
Czipperz