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