如何从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/

10-15 20:29