¿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)