Por que o Mutex não é liberado quando descartado?

Eu tenho o seguinte código:

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
    }
}

Eu estabeleci um ponto de interrupção dentro doif bloco e executou o mesmo código em outra instância do Visual Studio. Como esperado, o.WaitOne Blocos de chamada. No entanto, para minha surpresa, assim que eucontinuar em primeira instância e ousing Quando o bloco termina, recebo uma exceção no segundo processo sobre um Mutex abandonado.

A correção é chamarReleaseMutex:

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();
}

Agora, as coisas funcionam como esperado.

Minha pergunta: Normalmente, o ponto de umIDisposable é issolimpa qualquer que seja o estado em que você coloca as coisas. Eu poderia ver talvez ter múltiplosespera elançamentos dentro de umusing bloco, mas quando o identificador do Mutex é descartado, ele não deve ser liberado automaticamente? Em outras palavras, por que preciso ligarReleaseMutex se eu estiver em umusing quadra?

Agora também estou preocupado que se o código dentro doif Se travar blocos, terei abandonado mutexes por aí.

Existe algum benefício em colocarMutex em umusing quadra? Ou devo apenasnovo a Mutex exemplo, envolva-o em uma tentativa / captura e chameReleaseMutex() dentro dofinalmente bloco (basicamente implementando exatamente o que eupensamento Dispose() faria)

questionAnswers(9)

yourAnswerToTheQuestion