次のコードは、アプリケーションを終了しません。アプリケーションを終了し、実行中のすべてのスレッドが閉じていることを確認するにはどうすればよいですか?
foreach (Form form in Application.OpenForms)
{
form.Close();
}
Application.Exit();
コード内でスレッドの使用を示していませんが、スレッドが含まれているとします。すべてのスレッドを閉じるには、起動する前にすべてのスレッドをバックグラウンドスレッドに設定する必要があります。アプリケーションが終了すると、自動的に閉じられます。
Thread myThread = new Thread(...);
myThread.IsBackground = true; // <-- Set your thread to background
myThread.Start(...);
Microsoftの「HOWTO:複数のスレッドを停止する」記事: http://msdn.Microsoft.com/en-us/library/aa457093.aspx
次のコードを試すことができます:
Environment.Exit(Environment.ExitCode);
私はソフトウェアで同様の問題を経験しましたが、残念ながらスレッドをバックグラウンドで動作させるだけでは問題は解決しませんでした。実際、スレッドがデータを戻す間(メインソフトウェアはデータ駆動型)、アプリケーションを閉じると、Windowsエラーが発生し、デバッグメッセージが表示されます。
だから実際に私のために働いたもの:
ステップ1:すべてのスレッドをバックグラウンドで実行する
Thread aThread = new Thread(MethodName);
aThread.IsBackground = true; //<-- Set the thread to work in background
aThread.Start();
ステップ2:フォーム/アプリケーションの終了アクションで、Environment.Exitメソッドを呼び出します。
Environment.Exit(Environment.ExitCode);
これにより、メモリが完全に管理され、メモリリークは発生しませんでした。
お役に立てれば。
これは、開いたすべてのスレッドで機能するはずです。
protected override void OnExiting(Object sender, EventArgs args)
{
base.OnExiting(sender, args);
Environment.Exit(Environment.ExitCode);
}
これで仕事が完了しました。
代わりに:
Application.Exit()
他のスレッドは開いたままにしておきます:
Environment.Exit(Environment.ExitCode);
これは、アプリケーションを(強制的に)確実に閉じるための最良の方法です。
(Process.GetCurrentProcess()).Kill()
Environment.Exit
の問題は、メインスレッド上にない限り機能しないことです。また、スレッドロックが発生することもあります。
プログラムが適切に閉じられない主な理由は、フォームがそれ自体(したがって、作成したすべてのオブジェクト)を破棄できないためです。これを修正するのははるかに困難です。破棄ハンドラが最初に呼び出されるまでしばらく待ってから、上記のコードを実行することをお勧めします。