写锁定被释放而不被保持

Dam*_*yer 8 .net c#

我有一种情况,ReadWriterLockSlim抛出异常"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. 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助 :-)

Pet*_*nov 9

但是如果在尝试输入锁定时抛出错误,那么它将最终执行,而不会保留它.为什么不简单地变为:

...
finally {
    if(cacheLock.IsWriteLockHeld)
        cacheLock.ExitWriteLock();
}
...
Run Code Online (Sandbox Code Playgroud)


Rei*_*ica 5

    try {
        cacheLock.EnterWriteLock();
        return "xyz";
    }
    finally {
        cacheLock.ExitWriteLock(); // Error is throwing here. 
    }
Run Code Online (Sandbox Code Playgroud)

问:如果cacheLock.EnterWriteLock();失败会怎样?

答:finally声明被执行.

  • cacheLock.ExitWriteLock(); 被叫
  • 但我们没有锁

试试这个:

private string ProcessText()
{
    cacheLock.EnterWriteLock();
    try {
        return "xyz";
    }
    finally {
        cacheLock.ExitWriteLock(); // Error is throwing here. 
    }
}
Run Code Online (Sandbox Code Playgroud)

据推测,.NET的设计方式是,如果EnterWriteLock()失败,则锁定被释放(或根本不被保持).