【发布时间】:2011-03-02 02:09:49
【问题描述】:
如何从 C# 中的 mutex 句柄中找到已获取的 mutex?
当mutex.WaitOne(timeout) 超时时,它返回false。但是,如何从互斥量句柄中找到它? (也许使用 p/invoke。)
更新:
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()如果不是我获取的就会抛出异常。
(通过 acquired 状态是指当我拥有互斥体时,互斥体处于未发出信号状态。)
(编辑:感谢mattdekrey's post,我添加了IsAcquired = false;。)
【问题讨论】:
标签: c# synchronization pinvoke mutex handle