How can I find from mutex handle in C# that a mutex is acquired?
When mutex.WaitOne(timeout)
timeouts, it returns false
. However, how can I find that from the mutex handle? (Maybe using p/invoke.)
UPDATE:
public class InterProcessLock : IDisposable
{
readonly Mutex mutex;
public bool IsAcquired { get; private set; }
public InterProcessLock(string name, TimeSpan timeout)
{
bool created;
var security = new MutexSecurity();
security.AddAccessRule(new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.Synchronize | MutexRights.Modify, AccessControlType.Allow));
mutex = new Mutex(false, name, out created, security);
IsAcquired = mutex.WaitOne(timeout);
}
#region IDisposable Members
public void Dispose()
{
if (IsAcquired)
{
mutex.ReleaseMutex();
IsAcquired = false;
}
}
#endregion
}
Currently, I am using my own property IsAcquired
to determine whether I should release a mutex. Not essential but clearer, would be not to use a secondary copy of the information represented by IsAcquired
property, but rather to ask directly the mutex whether it is acquired by me. Since calling mutex.ReleaseMutex()
throws an exception if it is not acquired by me.
(By acquired state I mean that the mutex is in not-signaled state when I am owning the mutex.)
(EDIT: I have added IsAcquired = false;
thanks to mattdekrey's post.)