|
分類:[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);の行]
そもそも、このような使い方をするユーザーコントロールは、上記のような方法で二重起動を検知するのには
無理があるのでしょうか?他に方法がございましたらご教示いただけますでしょうか。
よろしくお願いいたします。
|