Warum wird Mutex nicht freigegeben, wenn es entsorgt wird?
Ich habe folgenden Code:
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
}
}
Ich habe innerhalb der einen Haltepunkt gesetztif
blockieren und denselben Code in einer anderen Instanz von Visual Studio ausführen. Wie erwartet, die.WaitOne
Blöcke aufrufen. Zu meiner Überraschung jedoch, sobald ichfortsetzen in erster Linie und dieusing
Block beendet, ich bekomme im zweiten Prozess eine Ausnahme über einen aufgegebenen Mutex.
Die Lösung ist anzurufenReleaseMutex
:
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();
}
Jetzt läuft alles wie erwartet.
Meine Frage: Normalerweise ist der Punkt einesIDisposable
ist esSaubermachen In welchem Zustand auch immer Sie Dinge einsetzen. Ich konnte sehen, dass es vielleicht mehrere gabwartet undVeröffentlichungen innerhalb einesusing
Block, aber wenn der Griff zum Mutex entsorgt wird, sollte er nicht automatisch freigegeben werden? Mit anderen Worten, warum muss ich anrufen?ReleaseMutex
wenn ich in einem binusing
Block?
Mir geht es jetzt auch darum, ob der Code innerhalb derif
Blockabstürze, ich habe herumliegende Mutexe aufgegeben.
Gibt es einen Vorteil zu setzenMutex
in einemusing
Block? Oder sollte ich einfachneu auf a Mutex
Beispiel, wickeln Sie es in ein try / catch ein und rufen Sie aufReleaseMutex()
innerhalb desschließlich (Grundsätzlich genau das umsetzen, was ichhabe gedacht Dispose()
würdest du)