Как изящно выйти из AbandonedMutexException?
Я использую следующий код для синхронизации взаимоисключающего доступа к общему ресурсу между несколькими запущенными процессами.
Мьютекс создается так:
Mutex mtx = new Mutex(false, "MyNamedMutexName");
Затем я использую этот метод для входа во взаимоисключающий раздел:
public bool enterMutuallyExclusiveSection()
{
//RETURN: 'true' if entered OK,
// can continue with mutually exclusive section
bool bRes;
try
{
bRes = mtx.WaitOne();
}
catch (AbandonedMutexException)
{
//Abandoned mutex, how to handle it?
//bRes = ?
}
catch
{
//Some other error
bRes = false;
}
return bRes;
}
и этот код оставить его:
public bool leaveMutuallyExclusiveSection()
{
//RETURN: = 'true' if no error
bool bRes = true;
try
{
mtx.ReleaseMutex();
}
catch
{
//Failed
bRes = false;
}
return bRes;
}
Но происходит следующее: если один из запущенных процессов завершается сбоем или он завершается из диспетчера задач, мьютекс может вернутьсяAbandonedMutexException
исключение. Итак, мой вопрос, каков изящный способ выбраться из этого?
Кажется, это работает нормально:
catch (AbandonedMutexException)
{
//Abandoned mutex
mtx.ReleaseMutex();
bRes = mtx.WaitOne();
}
Но могу ли я войти во взаимоисключающий раздел в этом случае?
Может кто-нибудь уточнить?