使用 Mutex 'using' 时 Try-Finally-Release 是否多余?
Is a Try-Finally-Release redundant while using a Mutex 'using'?
我目前正在使用这样的互斥体(它又是 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
,finally 中的 mutex.ReleaseMutex()
也是多余的,因为 using 无论如何都会处理掉互斥量? (假设 mutex dispose 也释放了它)
调用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();
}
所以你的代码不是多余的
您认为处置 Mutex
释放互斥量的假设是错误的。处理互斥量只是告诉 OS 关闭互斥量,仅此而已。
跟踪互斥体的使用是您的工作。具体来说,获取互斥锁的线程必须释放互斥锁(在同一线程上),否则最终会得到一个废弃的互斥锁。这实际上是 Windows 要求,而不是 .NET 要求。
我目前正在使用这样的互斥体(它又是 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
,finally 中的 mutex.ReleaseMutex()
也是多余的,因为 using 无论如何都会处理掉互斥量? (假设 mutex dispose 也释放了它)
调用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();
}
所以你的代码不是多余的
您认为处置 Mutex
释放互斥量的假设是错误的。处理互斥量只是告诉 OS 关闭互斥量,仅此而已。
跟踪互斥体的使用是您的工作。具体来说,获取互斥锁的线程必须释放互斥锁(在同一线程上),否则最终会得到一个废弃的互斥锁。这实际上是 Windows 要求,而不是 .NET 要求。