У меня есть два экземпляра, работающих с одной и той же службой Windows. Они проверяют состояние здоровья друг друга и сообщают, обнаружена ли какая-либо проблема. У меня есть критическая работа, которую нужно выполнить, поэтому я запускаю ее с помощью подхода с откатом, он запускается в Master, и если Master не отвечает, он запускается в подчиненном. Эта работа должна связываться через определенный последовательный порт, я пытаюсь использовать Mutex для проверки состояния гонки. У меня нет доступа к продуктам, поэтому перед развертыванием я хочу убедиться, что мой подход в порядке. Поэтому, пожалуйста, предлагайте, подходит ли мое использование Mutex для данного случая.Использование именованных Mutex
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;
}
}
Там есть метод TryOpenExisting. –
Он появился в .NET 4.5. –