如何从C#中的互斥锁句柄中找到已获取互斥锁?
当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()
会引发异常(如果不是我所捕获的)。(通过获取状态,我的意思是当我拥有互斥锁时,该互斥锁处于未信号状态。)
(编辑:感谢mattdekrey's post,我添加了
IsAcquired = false;
。) 最佳答案
您可能会发现Mutex
类上没有公共(public)成员:
http://msdn.microsoft.com/en-us/library/system.threading.mutex_members.aspx
也没有为此提供的公共(public) native 功能:
http://msdn.microsoft.com/en-us/library/ms686360%28v=VS.85%29.aspx
但是,有一些未记录/不支持的功能,尤其是在ntdll.dll
中。这些允许访问系统对象。但是,这些功能可能会更改或在将来的操作系统版本中不可用。
因此,答案是:使用常规手段是不可能的。
关于c# - 如何找到C#中的互斥体?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3013212/