写锁定未被保持释放

我有一种情况,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(); } ...