Блоки ReaderWriterLock при попытке чтения ресурса - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь использовать ReaderWriterLock для общего ресурса между двумя Tasks. По какой-то причине он начинает ждать бесконечно:

class State {

        private const int TIMEOUT = 5000;
        private ReaderWriterLock lck = new ReaderWriterLock();
        private TimeSpan lastIssuedAt;

        public TimeSpan LastIssuedAt {
            get {

                this.lck.AcquireReaderLock(TIMEOUT);
                return this.lastIssuedAt;
            }
            set {
                this.lck.AcquireWriterLock(TIMEOUT);
                this.lastIssuedAt = value;
            }
        }
}

Когда задача пытается get свойство LastIssuedAt, оно просто блокируется, и я не понимаю, почему.

1 Ответ

1 голос
/ 06 мая 2019

Посмотрите на пример на MSDN: https://docs.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlock?view=netframework-4.8

Вы забыли снять блокировку.Обычный пример для этого: try / finally:

ReaderWriterLock lck = new ReaderWriterLock();

lck.AcquireReaderLock(timeOut);
try
{
    // Do what needs to be done under the lock
}
finally 
{
    // Ensure that the lock is released.
    lck.ReleaseReaderLock();
}

Также проверьте ReaderWriterLockSlim: https://docs.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlockslim?view=netframework-4.8, который MSDN рекомендует для новой разработки.

...