C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

IE上に配置したユーザーコントロールから二重起動チェック


(過去ログ 67 を表示中)

[トピック内 1 記事 (1 - 1 表示)]  << 0 >>

■39128 / inTopicNo.1)  IE上に配置したユーザーコントロールから二重起動チェック
  
□投稿者/ なおじ (1回)-(2009/07/30(Thu) 15:06:23)

分類:[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);の行]


 そもそも、このような使い方をするユーザーコントロールは、上記のような方法で二重起動を検知するのには
無理があるのでしょうか?他に方法がございましたらご教示いただけますでしょうか。

 よろしくお願いいたします。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -