写锁定未被保持释放
我有一种情况,ReadWriterLockSlim抛出exception“System.Threading.SynchronizationLockException – 写锁定被释放而不被保留。” 当我尝试执行ExitWriteLock()时。 据我所知,这不应该发生,因为进入try块的后续线程将“阻塞”直到他们可以获得锁定。 我在这里错过了什么吗?
该问题与此问题非常相似,但没有在那里发布任何解决方案。
//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. } } }
非常感谢您的帮助 :-)
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(); } ...
- C# – TextBoxvalidation
- 将匹配结果从regex转换为字符串列表
- Asp.Net MVC3:在ValidationContext中设置自定义IServiceProvider,以便validation器可以解析服务
- 将JSON字符串反序列化为Dictionary
- 如何从javascript函数调用代码隐藏方法?
- 为什么调用等待过早地完成父任务?
- 如何将带有键/值的数组转换为JSON c#
- NetSuite SuiteTalk – 从“SearchColumnSelectCustomField”中检索值字符串
- Visual Studio 2015 RCentity framework6.1.3迁移错误