写锁定被释放而不被保持

时间:2011-10-12 05:14:25

标签: c# .net

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

非常感谢你的帮助: - )

2 个答案:

答案 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()失败,则锁定被释放(或者根本不会被释放)。