2009-05-25 58 views
16

Application.Shutdownを呼び出したときにアプリケーションが終了しないことがありますが、UIは終了しましたが、プロセスはまだ実行されています。すべてのスレッドを閉じてアプリケーションをシャットダウンする方法は? Environment.Exit()はすべてのスレッドを閉じることができますか? Win32 API TerminateThreadを呼び出す必要がありますか?Environment.Exit()とApplication.Shutdown()の違いは何ですか?

答えて

17

Environment.Exit()あなたのアプリケーションを終了するためのより残忍な方法ですが、一般的には、アプリケーションを終了して閉じる必要がある場合は、間違った方法で問題を見ていると思います。 他のスレッドが正常に終了しない理由を調べるべきですか?

メインフォームのFormClosing eventを調べて、アプリケーションをハングアップしているリソースをクローズしないようにすることができます。

これは、アプリをハングアップするリソースが見つかりました。デバッグモードで

  1. threads(これはあなたのアプリケーションが実行されているすべてのスレッドを見ることができるようになります)
  2. の上映を可能にする、それが正しく閉じないような方法でアプリケーションを閉じます。
  3. Visual Studioのポーズインを押してください
  4. スレッドリストを見て、それらがハングしているintを参照すると、どのリソースが閉じているかを見ることができ、FormClosingイベントに移動します閉じる/そこに廃棄してください。
  5. アプリが正常に閉じ刚性:)

あなたがクリックしたときにデバッグモードでスレッドリストがなく、あなたのコントロール下で実行されているいくつかのスレッドが表示されます、これらのスレッドはrarly名前を持っているとされることに注意してくださいを繰り返しそれらにはシンボルがないというメッセージが表示されます。これらは安全に無視することができます

アプリケーションが正常に閉じることを確認する理由の1つは、一部のリソース(FileStream)が動作していない場合、いくつかのAPIを使用してすばやく強制的にすべての種類書かれていない設定/データファイルのような「ランダム」な問題が発生します。

+0

「Application.Shutdown」と呼ばれるお返事ありがとうございますが、プロセスはまだ実行されていませんでしたが、どのスレッドが実行されているかを確認する方法を試しましたが、このバグは再生成されませんでした... –

8
  1. あなたNEVERコールTerminateThread
  2. あなたが産卵すべてのスレッドが背景としてマークされ、それらが完了するのを、あなたがアプリケーションを閉じるこの方法は、それが待機しないことを確認する必要があります。
+0

ああ、驚くばかり。私はあなたが#2をすることができるかどうかはわかりませんでした。 – Joel

+1

IsBackgroundがこの問題を解決しました。非常に便利で、それはもっと広く知られていません。 – SouthShoreAK

1

Shayは言ったように、TerminateThreadを呼び出さないでください。TerminateThreadは1つのスレッドだけをクリーンアップせずに処理しますが、プロセスの他のスレッドでデッドロックや破損が発生する可能性があります。

TerminateProcessはプロセス全体を終了させ、OSをクリーンアップさせます。これはプロセスを閉じる最速の方法です。OSがクリーンアップできないリソースを保持していないことを確認するだけですTerminateProcessを呼び出す前にウィンドウを閉じることもできます)。

私は思っていますが、Environemnt.ExitがTerminateProcessを呼び出していることを確認していません。

Application.Shutdownは非常に異なります。プロセスをすぐに終了させることはありません。すべての終了通知とシャットダウン通知を送信し、すべてのアプリケーションのウィンドウとスレッドが閉じられるのを待ちます。

関連する問題