I'm working on 2 Windows Services that have a common database which I want to lock (cross-process) with a system Mutex.
Now I'm wondering whether it's ok to just call WaitOne()
and ReleaseMutex()
in a try-finally
block or should I also dispose the Mutex (e.g. in a using
block). If so I guess I should always catch the AbandonedMutexException
on the WaitOne()
method or am I wrong here?
A mutex is a Windows kernel object (here wrapped in a .NET object).
As such, it is an unmanaged resource that should be disposed.
More accurately, the .NET object contains a HANDLE to the mutex, which must be released/disposed of somehow.
I don't trust that code sample in the Mutex class docs where the mutex object is not disposed. Although Henzi has a good point in comment: The Mutex object is static and would be either disposed by the finalizer or destroyed by the Windows kernel when the process exits.
Also, note that Close() disposes the object as well.
Of course, there's nothing wrong with keeping an existing Mutex object in your app even while you don't use it. They are light resources.
According to this a named
Mutex
is automatically destroyed when the last process holding aHANDLE
of that Mutex ends.In non-managed terms MSDN says
In .NET you should call
.Close()
on theMutex
- this releases theHANDLE
... since every process gets its ownHANDLE
when accessing even the same namedMutex
this is consistent practice... not callingClose()
won't leave any problems behing once the process is no more (finalizers and all)...You need to dispose the resources which are used by the waithandle.
From the documentation:
The waithandle uses unmanaged resources which should be disposed at the end of use.
MSDN Documentation Mutex