私はc#とj#の非常に大きなアプリケーション混合物をいくつか持っています。
時々私がそれを閉じると、閉じられていないスレッドがいくつかあり、それらはタスクマネージャにハングしていて、そこからそれらを殺すことは不可能です。
これらのスレッドをすべて見つけて、それらをクローズイベントに追加するのは本当に問題があります。
クロージングイベントでアプリケーションによって開かれたすべてのスレッドを激しく殺す方法はありますか?...
ありがとう。
アプリケーションを閉じているときにどのスレッドが開かれ、誰がそれらを開いたかを教えてくれるツールがありますか?
このは発生しないはずです。もしそうなら、間違った方法で対処しようとしています。
アプリケーションが終了すると、.NET Frameworkは IsBackground
property が「True」に設定されているスレッドを自動的に強制終了します。各ワーカースレッドをバックグラウンドスレッドとして指定すると、この問題は発生しなくなります。 BackgroundWorker
class と ThreadPool
class を利用すると、バックグラウンドスレッドが自動的に作成されるため、はるかに優れたオプションです。
それ以外の場合は、フォアグラウンドスレッドを明示的にクリーンアップする必要があります。適切に設計されたアプリケーションは、独自のブックキーピングを行い、Main
メソッドを終了する前にすべてのスレッドが確実に閉じられるようにする決定的で構造化された方法を使用します。これは、スレッドが適切な終了を必要とする場合にとにかくすべきことです。
プロセスを強制終了することは非常に悪い考えです。アプリケーションでスレッドを自由に実行できるようにすることです。
次を使用できます。Environment.Exit(0); 、スレッドが実行されている場合にアプリケーションをシャットダウンし、問題を引き起こしません。
スレッドを適切に閉じる必要がありますが、推奨されていないが可能な方法をあなたと他の人に知ってほしいだけです。
onCloseハンドラーで:
System.Diagnostics.Process.GetCurrentProcess().Kill();
私はそれを行うCody Grayの方法を完全に好みます。
Application.Exit()
を呼び出すこともできますが、それはあまり役に立ちません。肝心なのは、適切に処理したい場合は、すべてのスレッドを自分で適切に閉じる必要があるということです。
フォーム/アプリケーションを閉じるときに同様の問題が発生していました。デバッグモードから実際に終了するのではなく、設計モードになります。以下は私の問題を解決します。
internal void Close()
{
Dispatcher.CurrentDispatcher.Thread.Abort();
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
Application.Current.Shutdown();
}
私の2セント...すべての答えに...
強制的にシャットダウンしてみてください
これらの行をvoid CurrentApplication_Exit(object sender, ExitEventArgs e)
およびprivate void Window_Closing(object sender, CancelEventArgs e)
に入れます
System.Windows.Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
System.Windows.Application.Current.Shutdown();