C# - 使用EnterWriteLock锁定问题

Ran*_*der 15 c# locking

以下代码来自MSDN:

private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
private Dictionary<int, string> innerCache = new Dictionary<int, string>();

public void Add(int key, string value)
{
    cacheLock.EnterWriteLock();
    try
    {
        innerCache.Add(key, value);
    }
    finally
    {
        cacheLock.ExitWriteLock();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在其他地方看到过这样的代码.EnterWriteLock()总是在try块之外.有谁知道为什么它不在try块内?

Hen*_*man 17

假设EnterWriteLock()失败了.无论出于何种原因

那么你不应该做的一件事是退出你从未输入过的锁.

这是一个非常基本的模式,例如也适用于流,但由于using() {}声明而不常见.

var s = File.Create(...);
// (only) if the previous line succeeded, 
// we gain the responsibility to close s, no matter what
try
{
   // do some I/O
}
finally
{
   s.Dispose();
}
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 6

因为那将是一个错误.在确定输入之前,不能调用ExitWriteLock.想象一下如果你将它移到try {}中会发生什么,并且EnterWriteLock()会抛出异常.这是一个双kaboom.Kabloom,搞砸了异常消息.