- PR -

アプリケーションが終了しない

1
投稿者投稿内容
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2008-09-11 10:00
あるシングルトンのクラスを作っていて、そのための簡単なテストフォームアプリケーションを書いたのですが、フォームを閉じてもアプリケーションが正常に終了してくれません。Main()でデバッガを走らせて見ると、最後の Application.Exit() まで実行するのですが、そのあとMain()ファンクションの最後のカッコまで行って、更にステップ実行すると現在の行を示すハイライトが消えてそのままになります。

毎回タスクマネージャに同じ名前のプロセスが増えていきます。タスクマネージャでたまったプロセスを消すのですが、なぜかマシンをブートしてから最初に作ったプロセスだけはタスクマネージャから消すことも出来ません(本当に消すのかの確認ダイアログが出て、「はい」を選択すると、ダイアログとプロセス名へのフォーカスは消えるがプロセスはそのまま)。

シングルトンクラスの中でDisposeもきちんと設定しているつもりです。Form の OnClose で Dispose も呼んでいます。なにかおかしいところがあるのでしょうか。

何か単純なところを見逃している気がします。どうぞよろしくお願いします。

コード:
//シングルトンのベースクラスの Dispose
       public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        internal virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (m_fileHandler != null)
                {
                    m_fileHandler.Dispose(); //自作ファイルハンドラ
                    m_fileHandler = null;
                }                
            }
        }

//シングルトンのDispose
        internal override void Dispose(bool disposing)
        {
            base.Dispose(disposing);

            if (s_client != null) //自分のリファレンス
            {
                s_client = null;
            }
        }

//ファイルハンドラのDispose
public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        private void Dispose(bool p)
        {
            if (p)
            {
                if (m_readSemaphore != null) // Semaphore
                {
                    m_readSemaphore.Close();
                    m_readSemaphore = null;
                }
                if (m_writeSemaphore != null)
                {
                    m_writeSemaphore.Close();
                    m_writeSemaphore = null;
                }
                if (m_watcher != null) // FileSystemWatcher
                {
                    m_watcher.Dispose();
                    m_watcher = null;
                }
            }
        }

よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-09-11 10:52
FileSystemWatcher を使用しているようですが、
FileSystemWatcher のイベントハンドラの処理が完了してなかったりしませんか?
たぶん、FileSystemWatcher のイベントハンドラは非同期で実行されます。

それとたぶん無関係ですが、とりあえず気づいたことです
・ファイナライザから Dispose(false) を呼び出していない
・既に Dispose を呼び出したかどうかのフラグがない
・シングルトンの Dispose(bool disposing) メソッドがなぜか internal

アンマネージドリソースの解放処理が含まれていないから
ファイナライザで Dispose(false) を呼び出しても別に何もしないわけですが
GC.SuppressFinalize(this) はなぜか呼び出してますね

_________________
C#と諸々
1

スキルアップ/キャリアアップ(JOB@IT)