我目前正在使用这样的互斥锁(反过来又是this SO的答案):
bool onlyInstance;
using (Mutex mutex = new Mutex(true, "Global\\mutexname", out onlyInstance))
{
try
{
if (onlyInstance)
{
// single instance code
}
}
finally
{
mutex.ReleaseMutex();
}
}
如果我没错,using
在内部使用try-finally
,那么最终冗余中的mutex.ReleaseMutex()
也是如此,因为无论如何使用会丢弃互斥锁吗? (假设互斥系统也会释放它)
答案 0 :(得分:3)
您假设处置Mutex
释放互斥锁是错误的。处置互斥锁只是告诉操作系统关闭互斥锁,仅此而已。
跟踪互斥锁的使用是你的工作。具体而言,获取互斥锁的线程必须释放互斥锁(在同一线程上),否则最终会使用废弃的互斥锁。这实际上是Windows要求,而不是.NET要求。
答案 1 :(得分:2)
调用Dispose
方法时运行的代码是:
protected virtual void Dispose(bool explicitDisposing)
{
if (this.safeWaitHandle != null)
{
this.safeWaitHandle.Close();
}
}
ReleaseMutex
执行的是:
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public void ReleaseMutex()
{
if (!Win32Native.ReleaseMutex(base.safeWaitHandle))
{
throw new ApplicationException(Environment.GetResourceString("Arg_SynchronizationLockException"));
}
Thread.EndCriticalRegion();
Thread.EndThreadAffinity();
}
所以你的代码不是多余的