【VB.NET】【WPF】アプリを閉じてもデバッグが停止しない(バックグラウンドプロセスに残る)

Visual Studio を使って、「デバッグの開始」をしてアプリケーションを起動する。動作を確認してアプリケーションを直接終了する(VS の「デバッグの停止」をするのではなく、アプリケーション上で Alt + F4 を押すとか、右上のバッテンをクリックする等して)。

いつもなら、アプリケーションを直接終了すれば、VS のデバッグも終了する。それがいつのまにか、アプリを閉じても、VS のデバッグが終了してないことに気付いた。この頃、Visual Studio Professional から Community に乗り換えた時期だったので、「Community ってそうなの?」とあまり疑問を持たずに「やれやれ・・・」と思いながら「デバッグの停止」ボタンを押していた。

しかし、あるとき、この異常が別の形で起きた。

プロジェクトをビルドしてから、出力された exe(EeoTemplate.exe)を直接ダブルクリックして実行し、動作を確認して終了した。そして exe を削除しようとしたが・・・なぜかできない。「EeoTemplate によってファイルは開かれているため、操作を完了できません。ファイルを閉じてから再実行してください。」というエラーが出た。

「おかしいな」と思ってタスクマネージャーを起動してみると、なぜかバックグラウンドプロセスに残ってる(見やすくなるよう少し画像を編集してます)。

exe の起動から終了までを観察してみると、起動したときは普通にフォアグラウンドのプロセスとして出現する。しかしそのウィンドウを閉じると、フォアグラウンドのプロセスから消えるのだが、なぜかそのままバックグラウンドのプロセスに移動する。

なんだこれ?(*´Д`)

いろいろ調べたところ、原因が2つあることが分かった。

このアプリケーションは、起動するときに、子ウィンドウを New して実態を得て、その実態をグローバル変数に入れている(必要になったときにその都度 New すると子ウィンドウへのデータのロードに時間がかかって画面が乱れるため)。そのグローバル変数に入れたウィンドウを何度も .ShowDialog で表示する必要があるため、子ウィンドウの .Closing イベントに e.Cancel = True を入れて .Visibility = .Collapsed してたのが原因の1つだった。

Forms の場合であれば、子ウィンドウの .Closing イベントで e.Cancel = True されていても、親ウィンドウが閉じれば子ウィンドウも強制的に閉じる。

しかし、WPF の場合はそれと異なり、子ウィンドウの .Closing イベントで e.Cancel = True されていると、親ウィンドウが閉じても子ウィンドウが閉じず、プロセスがバックグラウンドプロセスとして残ってしまうことが分かった。

そのあたりの詳細と解決方はこちらを参照してほしい:【VB.NET】【WPF】子ウィンドウを閉じてから再び表示させようとするとエラーが出る

もう1つの原因は、そもそも、親ウィンドウが閉じるときに子ウィンドウを明示的に閉じていなかったこと(e.Cancel = True のあるなしに関係なく)。

WPF では(Forms と違って)親ウィンドウが閉じても子ウィンドウは自動的に閉じないということを覚えておく必要がある。

 

コメントの投稿

avatar
  購読する  
通知を受け取る対象