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 Держите истину, и только этот поток может выйти из блокировки.

Другие вопросы по тегам