C# - 使用EnterWriteLock锁定问题

时间:2011-08-15 21:36:04

标签: 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();
    }
}

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

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:6)

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

答案 2 :(得分:3)

如果EnterWriteLock抛出异常,则无需调用ExitWriteLock,因此它不在try块中。如果成功调用EnterWriteLock,则应始终调用ExitWriteLock。在某些情况下,您可能希望在EnterWriteLock周围包装一个try块,因为它可以抛出LockRecursionException。 ExitWriteLock也可以抛出SynchronizationLockException,并且可能需要在您的应用程序中使用try块。