Делаем IDistributedCache поточно-ориентированным в. Net Core 3.1 - PullRequest
1 голос
/ 21 марта 2020

Мне нужно использовать IDistributedCache в моем приложении, и это может быть MemoryDistributedCache или RedisCache в качестве базовой реализации. Насколько я понимаю, они не являются поточно-ориентированными, поэтому я создал свою собственную обертку с использованием ReaderWriterLockSlim.

ReaderWriterLockSlim, которая позволяет использовать несколько потоков для чтения или эксклюзивный доступ для записи. И теперь я задаюсь вопросом, является ли это правильным инструментом для работы, и если MemoryDistributedCache и RedisCache методы чтения являются поточно-ориентированными.

Что касается общего решения - я понимаю, что требуется время для хранения и чтения значений из распределенный кеш, как Redis. Но у меня нет особого выбора, поскольку значения, которые я храню, еще медленнее получать и обрабатывать.

Вот фрагмент:

...
        public async Task<byte[]> GetAsync(string key, CancellationToken token = new CancellationToken())
        {
            _cacheLock.EnterReadLock();
            try
            {
                return await _cache.GetAsync(GetCacheKey(key), token);
            }
            finally
            {
                _cacheLock.ExitReadLock();
            }
        }

        public async Task SetAsync(string key, byte[] value, DistributedCacheEntryOptions options, CancellationToken token = new CancellationToken())
        {
            _cacheLock.EnterWriteLock();
            try
            {
                await _cache.SetAsync(GetCacheKey(key), value, options, token);
            }
            finally
            {
                _cacheLock.ExitWriteLock();
            }
        }

        public async Task RemoveAsync(string key, CancellationToken token = new CancellationToken())
        {
            _cacheLock.EnterWriteLock();
            try
            {
                await _cache.RemoveAsync(GetCacheKey(key), token);
            }
            finally
            {
                _cacheLock.ExitWriteLock();
            }
        }

1 Ответ

0 голосов
/ 22 марта 2020

Все реализации IDistributedCache должны быть поточно-ориентированными. Если это не так, создайте отчет об ошибке, чтобы исправить его.

Даже если один из них не является поточно-ориентированным, использование ReaderWriterLockSlim для защиты async кода недопустимо. Начиная с документы :

ReaderWriterLockSlim управляет связью потоков; то есть каждый объект Thread должен выполнять свои собственные вызовы методов для входа и выхода из режимов блокировки. Никакой поток не может изменить режим другого потока.

Самый простой обходной путь - использовать SemaphoreSlim вместо ReaderWriterLockSlim.

...