web-dev-qa-db-ja.com

C#アプリケーションを正しく終了する方法

私はC#で公開アプリケーションを持っています。ここでの問題は、赤い終了ボタンをクリックしてメインフォームを閉じると必ずフォームが閉じられるが、アプリケーションが閉じないことです。コンピュータをシャットダウンしようとしたときにこれがわかりました。作成したアプリケーションがスムーズに実行されていることを確認してから、MessageBox Alertsを配置した多くの子ウィンドウが攻撃されました。

私はApplication.Exitを試しましたが、それでもすべての子ウィンドウとアラートを呼び出していますので、Environment.Exitの使い方やどの整数を入れるのかわかりません。ところで、私のフォームがformclosedイベントまたはform closingイベントを呼び出すときはいつでも、私はthis.Hide()関数でアプリケーションを閉じます。これは私のアプリケーションの動作に影響を与えますか?

161

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が機能しないのはなぜですか?

279
Furqan Safdar

私はこれがあなたが抱えていた問題ではないことを知っています、しかしこれが起こり得るもう一つの理由はあなたがあなたのアプリケーションで開いている非バックグラウンドスレッドを持っているということです。

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の場合、スレッドが完了するまでプログラムは開いたままになります。IsBackgroundtrueに設定した場合、スレッドはプログラムを開いたままにしません。 BackgroundWokerThreadPool、およびTaskのようなものはすべて、IsBackgroundtrueに設定したスレッドを内部的に使用します。

14

必要なのはSystem.Environment.Exit(1);だけです

そしてそれはあなたがプロジェクトを開始するときほとんど常にそこにあるシステムの名前空間 "using System"を使います。

12
Omar Moodie

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

一言で言えば、はい。メインフォーム(MainメソッドのApplication.Runで開始されたフォーム)が閉じられる(隠されない)と、アプリケーション全体が終了します。

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

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

7
Servy

私は次のいずれかになります。

Application.Exit();

winformまたは

Environment.Exit(0);

コンソールアプリケーション用(winformでも動作します)。

ありがとうございます。

3
Techcraft7

あなたはしますか:

Application.Run(myForm);

あなたのMain()に?

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

2
LightStriker
Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error
1
joe pelletier