Почему Mutex не освобождается при утилизации?
У меня есть следующий код:
using (Mutex mut = new Mutex(false, MUTEX_NAME))
{
if (mut.WaitOne(new TimeSpan(0, 0, 30)))
{
// Some code that deals with a specific TCP port
// Don't want this to run at the same time in another process
}
}
Я установил точку останова вif
заблокировать и запустить тот же код в другом экземпляре Visual Studio. Как и ожидалось,.WaitOne
блоки вызова. Однако, к моему удивлению, как только яПродолжить в первую очередь иusing
блок завершается, я получаю исключение во втором процессе о заброшенном Mutex.
Исправить это позвонитьReleaseMutex
:
using (Mutex mut = new Mutex(false, MUTEX_NAME))
{
if (mut.WaitOne(new TimeSpan(0, 0, 30)))
{
// Some code that deals with a specific TCP port
// Don't want this to run twice in multiple processes
}
mut.ReleaseMutex();
}
Теперь все работает как положено.
Мой вопрос: Обычно точкаIDisposable
этоочищает в каком бы состоянии вы ни ставили вещи. Я мог видеть, возможно, иметь несколькождет а такжерелизы в пределахusing
блок, но когда ручка для Mutex расположена, не должен ли он быть выпущен автоматически? Другими словами, зачем мне звонитьReleaseMutex
если я вusing
блок?
Я также теперь обеспокоен тем, что если код внутриif
сбой блока, я оставлю мьютексы, валяющиеся вокруг.
Есть ли польза от сдачиMutex
вusing
блок? Или я должен простоновый a Mutex
например, оберните его в try / catch и вызовитеReleaseMutex()
в пределахв конце концов блок (в основном реализуя именно то, что ядумал Dispose()
сделал бы)