У нас есть веб-сайт, на котором работает .NET 2.0, и мы начали использовать ASP.Net HttpRuntime.Cache для хранения результатов частого поиска данных, чтобы сократить доступ к нашей базе данных.
Фрагмент:
lock (locker)
{
if (HttpRuntime.Cache[cacheKey] == null)
{
HttpRuntime.Cache.Insert(cacheKey, GetSomeDataToCache(), null, DateTime.Today.AddDays(1), Cache.NoSlidingExpiration);
}
return ((SomeData)HttpRuntime.Cache[cacheKey]).Copy();
}
Мы пессимистично блокируемся всякий раз, когда хотим посмотреть кеш. Тем не менее, я видел различные блоги, опубликованные в Интернете, в которых предлагалось выполнить блокировку после проверки значения кеша, чтобы избежать накладных расходов на блокировку. Это не кажется правильным, поскольку после проверки в кеш мог быть записан другой поток.
Итак, наконец, мой вопрос: каков «правильный» способ сделать это? Используем ли мы даже правильный объект синхронизации потоков? Мне известно о ReaderWriterLockSlim (), но мы используем .NET 2.0.