以下代码来自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块中?
答案 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块。