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 ответ
Решение
Судя по виду конструктора, вы используете System.Threading.Timer
, Обратный вызов этого таймера выполняется в потоке потоков.
Блокировка записи не снята, просто обратный вызов, указанный вами для Timer, выполняется в другом потоке, и этот поток не удерживает блокировку записи, поэтому утверждение Assert.AreEqual(true, _lock.IsWriteLockHeld);
в обратном вызове происходит сбой, вызывая исключение.
Один поток входит в блокировку, и только для этого потока IsWriteLockHeld
Держите истину, и только этот поток может выйти из блокировки.