| 分類:[C#]
C# 2005で、IE上のObjectタグで表示できるようCOM参照可能にしたユーザーコントロールを作成しています。 特定のページでのみこのユーザーコントロールを表示するのですが、複数のIEウィンドウで表示・機能してし まうと困るものであるため、すでに別のIE上で表示されていたら機能しないようにしたいと考えています。
お伺いしたいことは、IE上に表示するユーザーコントロールを二重起動させない方法です。私なりに調べて、 「Mutex」を用いて以下のように記述してみました。
/// ↓↓クラス変数 // 二重起動チェック用Mutex private System.Threading.Mutex _hMutex; /// ↑↑↑
/// ↓↓ユーザーコントロールのコンストラクタ内 _hMutex = new System.Threading.Mutex(false, Application.ProductName); GC.KeepAlive(_hMutex); if (!_hMutex.WaitOne(0, false)) { // すでに起動されているため、使用不可になるよう処理を行う } /// ↑↑↑
/// ↓↓IDisposable.Disposeメソッドの実装(このユーザーコントロールはIDisposableインターフェースを実装してます) void IDisposable.Dispose() { // Mutex を閉じる _hMutex.ReleaseMutex(); _hMutex.Close(); } /// ↑↑↑
これにより、別個のIEウィンドウでユーザーコントロールを含むページを表示させたとき正しく動作するように なりましたが、以下の手順で操作を行うと「放棄されたミューテックスのため、待機は完了しました。」という Mutexの例外が発生してしまいます。
1.ユーザーコントロールを含むIEウィンドウを表示する。(ページAとします) 2.このページから新しいIEウィンドウを開きます。表示されるページにはユーザーコントロールは含まれてお らず、ページAを表示するリンクがあるものとします。(開いたページをページBとします) 3.ページAをIEウィンドウの×ボタンで閉じたあと、ページBからShiftキーなりで新しいIEウィンドウを開き、 ページAを表示します。→ここで以下の例外が発生します。
System.Threading.AbandonedMutexException: 放棄されたミューテックスのため、待機は完了しました。 場所 System.Threading.WaitHandle.WaitOne(Int64 timeout, Boolean exitContext) 場所 System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext) 場所 [ユーザーコントロールソースの_hMutex.WaitOne(0, false);の行]
そもそも、このような使い方をするユーザーコントロールは、上記のような方法で二重起動を検知するのには 無理があるのでしょうか?他に方法がございましたらご教示いただけますでしょうか。
よろしくお願いいたします。 |