Ich habe zwei Instanzen des gleichen Windows-Dienstes ausgeführt. Sie überprüfen die Gesundheit der anderen und berichten, wenn ein Problem gefunden wird. Ich habe einen kritischen Job, der ausgeführt werden muss, damit ich ihn mit einem Failover-Ansatz ausführen kann, er läuft im Master und wenn der Master nicht antwortet, läuft er im Slave. Dieser Job muss über eine bestimmte serielle Schnittstelle kommunizieren. Ich versuche, Mutex zu verwenden, um den Race-Zustand zu überprüfen. Ich habe keinen Zugriff auf die Produktion, also möchte ich vor der Bereitstellung sicherstellen, dass mein Ansatz in Ordnung ist. Bitte schlage also vor, ob meine Verwendung von Mutex für den gegebenen Fall in Ordnung ist.Benutzt 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);
Und dann in 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;
}
}
Es ist TryOpenExisting Methode aufzurufen. –
Es erschien in .NET 4.5. –