C# 写锁被释放而不被保持

C# 写锁被释放而不被保持,c#,.net,C#,.net,在我尝试执行ExitWriteLock()时,我遇到了ReadWriterLockSlim在抛出异常“System.Threading.SynchronizationLockException-写入锁在未被保持的情况下被释放”的情况。就我所知,这不应该发生,因为进入try块的后续线程将“阻塞”,直到它们能够获得锁为止。我是不是遗漏了什么 这个问题看起来非常类似,但是没有发布解决方案 //Code simplified for example. public class i18nService

在我尝试执行ExitWriteLock()时,我遇到了ReadWriterLockSlim在抛出异常“System.Threading.SynchronizationLockException-写入锁在未被保持的情况下被释放”的情况。就我所知,这不应该发生,因为进入try块的后续线程将“阻塞”,直到它们能够获得锁为止。我是不是遗漏了什么

这个问题看起来非常类似,但是没有发布解决方案

//Code simplified for example. 

public class i18nService {
    internal static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);

    private string ProcessText()
    {
        try {
            cacheLock.EnterWriteLock();
            return "xyz";
        }
        finally {
            cacheLock.ExitWriteLock(); // Error is throwing here. 
        }
    }
}
非常感谢您的帮助:-)

问:如果
cacheLock.EnterWriteLock(),会发生什么失败

答:
finally
语句被执行

  • cacheLock.ExitWriteLock()被调用
  • 但是我们没有锁
试试这个:

private string ProcessText()
{
    cacheLock.EnterWriteLock();
    try {
        return "xyz";
    }
    finally {
        cacheLock.ExitWriteLock(); // Error is throwing here. 
    }
}

假定.NET的设计方式是,如果
EnterWriteLock()
失败,锁将被释放(或根本不被持有)。

但是如果试图进入锁时抛出错误,那么它将最终执行,而不会持有锁。为什么不干脆选择:

...
finally {
    if(cacheLock.IsWriteLockHeld)
        cacheLock.ExitWriteLock();
}
...

代布兰登。谢谢你的回复。事实上,我也是这么想的,但我不确定情况是否如此。from“此方法阻塞直到调用线程进入锁,因此可能永远不会返回。使用TryEnterWriteLock方法阻塞指定的时间间隔,然后在调用线程在该时间间隔内未进入写入模式时返回。”但是,正如您所指出的,我不允许EnterWriteLock()出现异常。。。六羟甲基三聚氰胺六甲醚。。。让我再玩一会儿。嗨,彼塔。我认为你(和布伦丹)是对的。干杯:-)
...
finally {
    if(cacheLock.IsWriteLockHeld)
        cacheLock.ExitWriteLock();
}
...