同じWindowsサービスを実行しているインスタンスが2つあります。彼らはお互いの健康状態をチェックし、問題が見つかった場合に報告します。私は実行する必要がある重要な仕事を持っているので、フェールオーバーの方法で実行しています。それはマスターで実行され、マスターが応答していなければスレーブで実行されます。この仕事は、特定のシリアルポートを介して通信する必要があります、私は競合状態をチェックするためにミューテックスを使用しようとしています。私は生産にアクセスできないので、展開する前に私のアプローチがうまくいくことを確認したい。ですから、私のミューテックスの使用がそのケースでうまくいくかどうかをお勧めします。名前付きミューテックスの使用
if (iAmRunningInSlave)
{
HealthClient hc = new HealthClient();
if (!hc.CheckHealthOfMaster())
return this.runJobWrapper(withMutex, iAmRunningInSlave);
else
return true; //master is ok, we dont need to run the job in slave
}
return this.runJobWrapper(withMutex, iAmRunningInSlave);
そしてrunJobWrapper
でbool runJobWrapper(bool withMutex, bool iAmRunningInSlave)
{
if (!withMutex)
return this.runJob(iAmRunningInSlave); //the job might be interested to know
Mutex mutex = null;
string mutexName = this.jobCategory + "-" + this.jobTitle; //this will be unique for given job
try
{
mutex = Mutex.OpenExisting(mutexName);
return false; //mutex is with peer, return false which will re-trigger slave
}
catch
{
try
{ //mean time mutex might have created, so wrapping in try/catch
mutex = new Mutex(true /*initiallyOwned*/, mutexName);
return this.runJob(iAmRunningInSlave); //the job might be interested to know where I am running
}
finally
{
if (null!=mutex) mutex.ReleaseMutex();
}
return false;
}
}
)mutex.ReleaseMutexは()immediately..IはGC.Collectを(呼び出すために持っていたミューテックスを解放していなかったことに気づきました。 –
.NET 4.5で登場しました。 –