ReaderWriterLockSlim和计时器

时间:2015-01-29 09:28:52

标签: c# .net multithreading readerwriterlockslim

我对ReaderWriterLockSlim感到沮丧并且延迟了ExitWriteLock。 为什么WriteLock在定时器中被释放回调?

var _lock = new ReaderWriterLockSlim();
_lock.EnterWriteLock();
Assert.AreEqual(true, _lock.IsWriteLockHeld);   // good

System.Threading.Timer timer = new Timer(state =>
{
    _lock.ExitWriteLock(); //throws exception that lock is not held
}, null, 1, -1);

Thread.Sleep(1000);
Assert.AreEqual(false, _lock.IsWriteLockHeld);

1 个答案:

答案 0 :(得分:5)

通过构造函数的外观,您使用的是System.Threading.Timer。该计时器的回调在线程池线程上运行。

写锁定没有被释放,只是你为Timer指定的回调在另一个线程上运行,并且该线程没有保持写锁定,所以断言{{回调中的1}}失败,导致异常。

一个线程进入一个锁,只有该线程的Assert.AreEqual(true, _lock.IsWriteLockHeld);成立,并且只有该线程可以退出锁。