¿Por qué no se libera Mutex cuando se desecha?

Tengo el siguiente 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
    }
}

He establecido un punto de interrupción dentro delif bloque, y ejecutó el mismo código dentro de otra instancia de Visual Studio. Como se esperaba, el.WaitOne Llamar bloques. Sin embargo, para mi sorpresa, tan pronto como yoHacer continuación en primera instancia y lausing el bloque termina, obtengo una excepción en el segundo proceso sobre un Mutex abandonado.

La solución es llamarReleaseMutex:

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

Ahora, las cosas funcionan como se esperaba.

Mi pregunta: Por lo general, el punto de unIDisposable Lo eslimpia cualquiera que sea el estado en el que pones las cosas. Pude ver quizás tener múltiplesmurga ylanzamientos Dentro de unusing bloque, pero cuando se elimina el identificador del Mutex, ¿no debería liberarse automáticamente? En otras palabras, ¿por qué tengo que llamar?ReleaseMutex si estoy en unusing ¿bloquear?

Ahora también me preocupa que si el código dentro delif bloquear bloqueos, habré abandonado mutexes por ahí.

¿Hay algún beneficio en ponerMutex en unusing ¿bloquear? O deberíanuevo arriba a Mutex ejemplo, envuélvelo en un try / catch y llamaReleaseMutex() dentro definalmente bloque (Básicamente implementando exactamente lo que yopensamiento Dispose() haría)

Respuestas a la pregunta(9)

Su respuesta a la pregunta