Почему 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() сделал бы)