web-dev-qa-db-ja.com

アプリケーションによって開かれたすべてのスレッドを殺す

私はc#とj#の非常に大きなアプリケーション混合物をいくつか持っています。

時々私がそれを閉じると、閉じられていないスレッドがいくつかあり、それらはタスクマネージャにハングしていて、そこからそれらを殺すことは不可能です。

これらのスレッドをすべて見つけて、それらをクローズイベントに追加するのは本当に問題があります。

クロージングイベントでアプリケーションによって開かれたすべてのスレッドを激しく殺す方法はありますか?...

ありがとう。

アプリケーションを閉じているときにどのスレッドが開かれ、誰がそれらを開いたかを教えてくれるツールがありますか?

34
Night Walker

このは発生しないはずです。もしそうなら、間違った方法で対処しようとしています。

アプリケーションが終了すると、.NET Frameworkは IsBackground property が「True」に設定されているスレッドを自動的に強制終了します。各ワーカースレッドをバックグラウンドスレッドとして指定すると、この問題は発生しなくなります。 BackgroundWorker classThreadPool class を利用すると、バックグラウンドスレッドが自動的に作成されるため、はるかに優れたオプションです。

それ以外の場合は、フォアグラウンドスレッドを明示的にクリーンアップする必要があります。適切に設計されたアプリケーションは、独自のブックキーピングを行い、Mainメソッドを終了する前にすべてのスレッドが確実に閉じられるようにする決定的で構造化された方法を使用します。これは、スレッドが適切な終了を必要とする場合にとにかくすべきことです。

プロセスを強制終了することは非常に悪い考えです。アプリケーションでスレッドを自由に実行できるようにすることです。

49
Cody Gray

次を使用できます。Environment.Exit(0); 、スレッドが実行されている場合にアプリケーションをシャットダウンし、問題を引き起こしません。

15
R.Vector

スレッドを適切に閉じる必要がありますが、推奨されていないが可能な方法をあなたと他の人に知ってほしいだけです。

onCloseハンドラーで:

System.Diagnostics.Process.GetCurrentProcess().Kill();

私はそれを行うCody Grayの方法を完全に好みます。

5
Locke

Application.Exit()を呼び出すこともできますが、それはあまり役に立ちません。肝心なのは、適切に処理したい場合は、すべてのスレッドを自分で適切に閉じる必要があるということです。

4
tzup

フォーム/アプリケーションを閉じるときに同様の問題が発生していました。デバッグモードから実際に終了するのではなく、設計モードになります。以下は私の問題を解決します。

  1. リンクをたどった。 Windowsフォームアプリケーション、スレッドは停止しません
  2. ステップ1では解決しませんでした。 Environment.Exit(0); -解決し、正常に動作しました。
0
user10779750
internal void Close()
{
    Dispatcher.CurrentDispatcher.Thread.Abort();
    Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
    Application.Current.Shutdown();
}
0
Mario

私の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();
0
Developer