2

ログオフ/シャットダウンすると、winformsアプリが正常にシャットダウンしません。メインフォームがあり、そのClosingイベントが正しく発生しますが、アプリケーションを維持するために何か他のものが必要です。Application.OpenFormsを確認すると、メインフォームは1つだけです。

トリッキーな点、そしておそらく問題があるのは、私のアプリケーションがShellWindowsを使用してInternet Explorerにフックし、IEイベントが発生したときにフォームを開くことがあるということです。これらのフォームの1つ以上を開いて閉じた後、シャットダウン時にアプリが閉じなくなります。

すべてのフォームオブジェクトなどをクリーンアップし、FinalReleaseComObject()を適切に呼び出していると思いますが、プロセスを開いたままにしている参照がどこかにあると思います。私のアプリが正常に閉じるのを妨げているのは何かを理解する方法はありますか?

4

3 に答える 3

3

バックグラウンドに設定されていないスレッドが実行されている場合も、アプリケーションは開いたままになります。独自のスレッドを作成する場合は、それらが適切に終了していることを確認してください。

スレッドが終了することが重要でない場合は、IsBackgroundをtrueに設定します。スレッドでAbortを呼び出して、(ある程度)強制的に強制終了することもできます。

于 2009-02-06T17:07:34.183 に答える
1

最も可能性の高い原因は、アプリケーションのメイン ウィンドウが閉じられたときに閉じられないバックグラウンド スレッドがぶら下がっていることです。設定とフレームワークのバージョンによっては、メイン スレッドが終了したときにバックグラウンド スレッドがアプリケーションを存続させることができます。

シャットダウン ウィンドウでは、通常、プロセスのメイン ウィンドウに WM_QUIT を送信して、実行中のすべてのアプリを終了するように求めます。WinForms はこのメッセージを喜んで使用してメイン ウィンドウをシャットダウンしますが、バックグラウンド スレッドが残っている場合は、実際のプロセスを続行できます。

于 2009-02-06T17:22:39.533 に答える
0

これは非常に厄介な方法ですが、ぶらぶらしているスレッドを強制終了したい場合は、アプリケーションで実行されているすべてのスレッドを System.Diagnostics.Process.GetCurrentProcess.Threads で取得し、列挙します。それらで Thread.Join() または Thread.Abort() を呼び出します。

作業中のメイン (UI) スレッド (Closing イベントを受け取るスレッド) で .Abort() を呼び出さないようにしてください。そのため、現在のスレッド (System.Threading.Thread) が中止しようとしているスレッドではないことを確認してください。

于 2009-02-08T01:36:38.103 に答える