Environment.Exit() と Application.Shutdown() の違いは何ですか? 質問する

Environment.Exit() と Application.Shutdown() の違いは何ですか? 質問する

呼び出してもアプリケーションが終了できないことがあるアプリケーション.シャットダウンUIは閉じられましたが、プロセスはまだ実行中です。すべてのスレッドを閉じてアプリケーションをシャットダウンするにはどうすればよいですか?環境.終了()すべてのスレッドを閉じることができますか?またはWin32 APIを呼び出す必要がありますスレッドを終了するそれをするために?

ベストアンサー1

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

あなたは、FormClosing イベントメイン フォームで、アプリケーションをハングアップさせて終了できないようにしているリソースをすべて閉じます。

これは、アプリをハングアップさせるリソースを見つけた方法です。

  1. デバッグモードでは、スレッド(これにより、アプリケーションが実行しているすべてのスレッドを確認できるようになります。)
  2. アプリケーションが正しく終了しない方法でアプリケーションを閉じます。
  3. Visual Studio で一時停止を押します。
  4. スレッド リストを確認し、それらをクリックして、それらがハングしているコードがどこにあるかを確認します。これで、アプリケーションの終了をブロックしているリソースがわかったので、FormClosing イベントに移動して、そこでそれらを閉じるか破棄します。
  5. アプリが正しく終了するまで繰り返します :)

デバッグ モードのスレッド リストには、実行されているものの、制御下にないスレッドがいくつか表示されることに注意してください。これらのスレッドに名前が付いていることはほとんどなく、クリックすると、シンボルがないことを示すメッセージが表示されます。これらは無視しても問題ありません。

アプリケーションが正常に終了することを確認する理由の1つは、一部のリソース(たとえば、ファイルストリーム) はまだ動作を完了していないため、何らかの API を使用して強制的に終了すると、設定/データ ファイルが書き込まれないなど、さまざまな「ランダムな」問題が発生する可能性があります。

おすすめ記事