使用 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 要求。