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)