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)