我有一种情况,即ReadWriterLockSlim抛出异常“System.Threading.SynchronizationLockException - 正在释放写锁定而不被保留。”当我尝试执行ExitWriteLock()时。据我所知,这不应该发生,因为进入try块的后续线程将“阻塞”直到他们可以获得锁定。我在这里错过了什么吗?
该问题看起来与this one非常相似,但没有在那里发布解决方案。
//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.
}
}
}
非常感谢你的帮助: - )
答案 0 :(得分:7)
但是如果在尝试输入锁定时抛出错误,那么它将最终执行,而不会保留它。为什么不简单地变成:
...
finally {
if(cacheLock.IsWriteLockHeld)
cacheLock.ExitWriteLock();
}
...
答案 1 :(得分:5)
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()
失败,则锁定被释放(或者根本不会被释放)。