在使用互联网使用'时,Try-Finally-Release是多余的?

时间:2016-01-20 09:54:57

标签: c# concurrency mutex

我目前正在使用这样的互斥锁(反过来又是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()也是如此,因为无论如何使用会丢弃互斥锁吗? (假设互斥系统也会释放它)

2 个答案:

答案 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();
}

所以你的代码不是多余的