Как я могу найти из mutex handle в С#, что мьютекс получен?
Когда mutex.WaitOne(timeout)
таймауты, он возвращает false
. Однако, как я могу найти это из дескриптора мьютекса? (Возможно, используя 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
}
В настоящее время я использую собственное свойство IsAcquired
, чтобы определить, должен ли я выпустить мьютекс. Не важно, но яснее, было бы не использовать вторичную копию информации, представленной свойством IsAcquired
, а скорее запрашивать непосредственно мьютекс, независимо от того, приобретена ли она мной. Поскольку вызов mutex.ReleaseMutex()
выдает исключение, если он не получен мной.
(По полученному состоянию я имею в виду, что мьютекс находится в состоянии без сигнализации, когда я владею мьютексом.)
(EDIT: я добавил IsAcquired = false;
благодаря сообщению mattdekrey.)