233

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

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

ちなみに、フォームがformclosedorform closingイベントを呼び出すときはいつでも、this.Hide()関数を使用してアプリケーションを閉じます。それは私のアプリケーションが現在どのように動作しているかに影響しますか?

4

4 に答える 4

403

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

于 2012-10-19T15:56:42.830 に答える
18

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

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

于 2013-10-08T21:18:18.397 に答える
9

ところで。フォームがformclosedまたはformcloseingイベントを呼び出すときはいつでも、this.Hide()関数を使用してアプリケーションを閉じます。それは私のアプリケーションが現在どのように動作しているかに影響しますか?

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

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

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

于 2012-10-19T16:51:12.587 に答える
-3

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

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}
于 2018-05-07T15:13:23.513 に答える