C# 在使用互斥锁时,Try-Finally-Release是否冗余;使用';?

C# 在使用互斥锁时,Try-Finally-Release是否冗余;使用';?,c#,concurrency,mutex,C#,Concurrency,Mutex,我目前使用的是类似so的互斥体(这反过来又是so答案的一个分支): 如果我没有记错的话,使用在内部使用了一个try finally,因此互斥体也是如此。ReleaseMutex()在finally中是多余的,因为使用会丢弃互斥体吗?(假设互斥体dispose也会释放它)调用dispose方法时运行的代码是: protected virtual void Dispose(bool explicitDisposing) { if (this.safeWaitHandle != null)

我目前使用的是类似so的互斥体(这反过来又是so答案的一个分支):


如果我没有记错的话,
使用
在内部使用了一个
try finally
,因此
互斥体也是如此。ReleaseMutex()
在finally中是多余的,因为使用会丢弃互斥体吗?(假设互斥体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();
}

因此,您的代码不是冗余的

您认为处理
互斥体
释放互斥体是错误的。处理互斥体只是告诉操作系统关闭互斥体,仅此而已


跟踪互斥锁的使用是您的工作。具体地说,获取互斥体的线程必须释放互斥体(在同一线程上),否则最终会得到一个废弃的互斥体。这实际上是Windows的要求,而不是.NET的要求。

这个问题间接地回答了您的问题,并提供了更多的背景信息。不是多余的,但也不是一般的模式。当这个线程崩溃时,其他线程是否应该继续正常工作?如果没有,则保留释放,但不使用try/finally。@HenkHolterman是的,即使崩溃,其他线程也需要继续执行。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public void ReleaseMutex()
{
    if (!Win32Native.ReleaseMutex(base.safeWaitHandle))
    {
        throw new ApplicationException(Environment.GetResourceString("Arg_SynchronizationLockException"));
    }
    Thread.EndCriticalRegion();
    Thread.EndThreadAffinity();
}