C#アプリケーションを適切に終了する方法は?


197

C#で公開されたアプリケーションがあります。ここでの問題は、赤い終了ボタンをクリックしてメインフォームを閉じると、フォームは閉じますが、アプリケーションは閉じません。コンピューターをシャットダウンしようとしたときにこれがわかりました。作成したアプリケーションがスムーズに実行されていて、MessageBoxAlerts を設定した多数の子ウィンドウに衝撃を受けたのではないかと思いました。

私は試しましたApplication.Exitが、それでもすべての子ウィンドウとアラートが呼び出され、どのように使用するかEnvironment.Exit、どの整数をそれに入れるかわかりません。

ちなみに、フォームがformclosedまたはform closingイベントを呼び出すたびに、アプリケーションをthis.Hide()関数で閉じます。これは私のアプリケーションの動作に影響しますか?


2
FormClosedまたはFormClosingを処理しない
SLaks

1
あなたがだけされていると言うように隠れてするのではなく、フォームを閉じて、それらを?これがアプリケーションが終了しない理由であると考えられます。開いた(非表示の)フォームがまだあります。
Xint0

次に、this.Hide()をthis.Close()にすべて置き換えますか?
ジョンアーネストグアダルーペ

1
Hide()やClose()は必要ありません。
Henk Holterman、2012年

1
Closeアクションとイベントに関するコードを投稿します。
Henk Holterman、2012年

回答:


329

MSDNから:

Application.Exit

終了する必要があることをすべてのメッセージポンプに通知し、メッセージが処理された後、すべてのアプリケーションウィンドウを閉じます。これは、Application.Run(WinFormsアプリケーション)を呼び出している場合に使用するコードです。このメソッドは、すべてのスレッドで実行中のすべてのメッセージループを停止し、アプリケーションのすべてのウィンドウを閉じます。

Environment.Exit

このプロセスを終了し、基になるオペレーティングシステムに指定された終了コードを提供します。これは、コンソールアプリケーションを使用しているときに呼び出すコードです。

この記事のApplication.ExitとEnvironment.Exitは、良いヒントを示しています。

プロパティをSystem.Windows.Forms.Application.Runチェックすることで、呼び出されたかどうかを確認できSystem.Windows.Forms.Application.MessageLoopます。trueの場合、Runが呼び出されており、WinFormsアプリケーションが次のように実行されていると想定できます。

if (System.Windows.Forms.Application.MessageLoop) 
{
    // WinForms app
    System.Windows.Forms.Application.Exit();
}
else
{
    // Console app
    System.Environment.Exit(1);
}

参照:Application.Exitが機能しないのはなぜですか?


サイレントモードで実行できるためフォームを表示しない引数を持つWinFormsアプリがあるので、これは私にとって本当に役に立ちました。フォームが非表示になるとApplication.Exit()、アプリを終了できませんでしたがEnvironment.Exit(1)、魅力のように機能しました。
Dib 2017

5
質問では、エラーが原因で終了することについて触れられていないため、終了コードはゼロである必要があります。Environment.Exit(0) ゼロ以外の値は、スクリプトが適切なアクションを実行するために使用できるアプリケーション固有のエラーコードです。(これは新しいコードとWinFormsアプリケーションなので、この場合は問題になることはほとんどありませんが、コマンドラインツールを作成している人には知っておくと
便利

Environment.Exitフォームアプリケーションにも使用できます。
Badiparmagi

1
私が間違っている場合は訂正してください。しかし、return後のステートメントでこのアプローチが大幅に改善されると思います。私が理解したように、コードはステートメントApplication.Exit()まで実行を続けreturnます。
Bighted19

17

これはあなたが持っていた問題ではないことを知っていますが、これが発生する可能性のある別の理由は、アプリケーションで非バックグラウンドスレッドが開いていることです。

using System;
using System.Threading;
using System.Windows.Forms;

namespace Sandbox_Form
{
    static class Program
    {
        private static Thread thread;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            thread = new Thread(BusyWorkThread);
            thread.IsBackground = false;
            thread.Start();

            Application.Run(new Form());

        }

        public static void BusyWorkThread()
        {
            while (true)
            {
                Thread.Sleep(1000);
            }
        }
    }
}

ときIsBackgroundfalse、それはあなたが設定されている場合、スレッドの完了まで営業してプログラムを維持するIsBackgroundにはtrue、スレッドプログラムを開いておくことはありません。、などのすべてのものはBackgroundWoker、内部でsetが設定されたスレッドを使用します。ThreadPoolTaskIsBackgroundtrue


14

あなたに必要なのは System.Environment.Exit(1);

また、プロジェクトを開始するときにほとんど常に存在する「using System」というシステム名前空間を使用します。


2
コンソールアプリケーションにのみ適しています。
Nidhin David 2014

もう一つ注意すべきは、イベントは、エラーが発生した場合も、終了コードは唯一の非ゼロでなければなりませんEnvironment.Exitのために呼び出され得ることはありませんFormClosed / FormClosingある
ラファエルスミット

9

次のいずれかを行います。

Application.Exit();

winformまたは

Environment.Exit(0);

コンソールアプリケーション用(winformsでも動作)。

ありがとう!


Environment.Exit(0)はWinFormsでも機能し、例外をスローせずにアプリケーションを存在させます。
MulleOne

8

ところで。フォームがformclosedイベントまたはフォーム終了イベントを呼び出すたびに、this.Hide()関数を使用してアプリケーションを閉じます。アプリケーションの動作に影響はありますか?

要するに、はい。メインフォーム(メソッドで開始さApplication.RunれたフォームMain)が閉じられると(非表示ではなく)、アプリケーション全体が終了します。

メインフォームが閉じられるたびにアプリケーション全体が常に完全に終了する必要がある場合は、そのフォームの閉じたハンドラーを削除するだけです。そのイベントをキャンセルせずに、ユーザーがイベントを閉じたときにフォームを閉じるようにすることで、目的の動作が得られます。他のすべてのフォームと同様に、フォームの同じインスタンスを再び表示するつもりがない場合は、フォームを閉じて非表示にするのではなく、フォームを閉じるだけです。それらを再度表示している場合は、非表示にしても問題ありません。

ユーザーがメインフォームの[x]をクリックできるようにしたいが、別のフォームを開いたままにして、事実上「新しい」メインフォームにする場合は、少し複雑になります。そのような場合は、メインフォームを閉じるのではなく単に非表示にする必要がありますが、アプリを本当に終了させたい場合に、メインフォームを実際に閉じるようなメカニズムを追加する必要があります。これが現在の状況である場合は、質問に、アプリケーションの種類を記述し、プログラムを実際に終了してはならないことを説明する詳細を追加する必要があります。


3

あなたはしますか:

Application.Run(myForm);

あなたのMain()で?

フォームを閉じたときにアプリケーションを強制終了するのはとても簡単な方法だと思いました。


1
はい、メインのProgram.csファイルにApplication.Runがあります。それを閉じるにはどうすればよいですか?
ジョンアーネストグアダルーペ

しかし、メインフォームをRunに渡しますよね?赤いXをクリックして閉じるフォーム
LightStriker '19年

はい、私はそれを持っています。それはそのようです:Application.Run(new Form2());
ジョンアーネストグアダルーペ

その場合、Runに渡されたメインフォームが完全に完全に閉じられていれば、アプリケーションは自動的に終了します。次に、そのフォームがまだ開いている、実行されている、またはどこかに隠れている理由を追跡する必要があります。
LightStriker 2012年


-4

この場合、アプリケーションを終了してApp.xaml.csのonExit()メソッドをオーバーライドする最も適切な方法は次のとおりです。

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}

これにより、exitイベントが発生したときにコードを実行できますが、実際にはexitイベントは発生しません。
jpaugh 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.