2 つのプロセスを同期するために、名前付きシステム ミューテックス アプローチを試みています。
- ac# Windows サービス
- デスクトップ C# アプリ
ミューテックスが作成されると、ミューテックスを作成しなかったプロセスは既存のミューテックスを検出しないようです。以下に詳しく説明します。
Windows サービスは、次のようにミューテックス (グローバル/ローカルなどのプレフィックスなし。通常の名前付きシステム ミューテックス) の作成を担当します。
Mutex myMutex= null;
try
{
myMutex= Mutex.OpenExisting(myMutexName);
}
catch (WaitHandleCannotBeOpenedException x)
{
//doesn't exist.
try
{
this.GetLogger().Info("Create Mutex");
bool createdNew = false;
new Mutex(false, myMutexName, out createdNew);
if (!createdNew) throw new Exception("Unable to create Mutex");
}
catch (Exception ex)
{
this.Stop();
}
}
catch (Exception x)
{
this.Stop();
}
finally
{
if (myMutex!= null)
{
try
{
myMutex.ReleaseMutex();
}
catch(Exception x)
{
this.GetLogger().Warn("Unable to release mutex");
}
}
}
これは onStart() にあります。また、サービスの他の場所では、このミューテックスで同期します。
さて、アプリケーションでは次のように使用します。
Mutex myMutex= null;
try
{
myMutex= Mutex.OpenExisting(this.myMutexName);
myMutex.WaitOne();
//do required stuff
}
catch (WaitHandleCannotBeOpenedException wcbox)
{
//doesn't exist yet. service not running??
this.GetLogger().Error("Background Service is not Running");
shutdownApp();
}
finally
{
if (myMutex!= null)
{
try
{
myMutex.ReleaseMutex();
}
catch (Exception x)
{
}
}
}
私の問題:
サービスが実行されていると、アプリは WaitHandleCannotBeOpenedException をスローします。これは、存在するミューテックスが表示されないことを意味します (ツール「WinObj」を使用してこれを確認しました。ミューテックスは「BaseNamedObjects」の下にタイプ「Mutant」として存在します)。なんで?ログインしているのと同じアカウントでサービスを実行しています。それがなくても、名前付きミューテックスはオペレーティング システム全体のオブジェクトなので、問題にはなりませんか?
ミューテックスがいつ破棄されるかは正確にはわかりません。現在、サービスを開始するとミューテックスが作成され、サービスを停止するとミューテックスが存在しないことがわかります(WinObj)。それは、ミューテックスを待っている人がいないとき、およびクリエータープロセスが終了したときに、ミューテックスがガベージコレクションされることを意味しますか?
一般に、名前付きシステム ミューテックスのライフ サイクルはどのようなものですか。具体的には、いつ死ぬのですか?