C # проблема с несколькими пользователями, пытающимися получить доступ к кешированному объекту - PullRequest
0 голосов
/ 01 октября 2009

Мне нужно хранить набор данных в кеше в течение X минут, и когда он истекает, он у меня получается, чтобы следующий запрос проверял, существует ли кеш, а затем отправляется, извлекает обновленные данные и устанавливает кэш. Проблема заключается в том, что в это время придет другой пользователь и попытается получить доступ к объекту и вызвать исключение. Как я могу предотвратить это?

Ответы [ 2 ]

3 голосов
/ 01 октября 2009

Это можно сделать с помощью оператора блокировки в C #.

Вам нужна переменная объекта, которая используется как «блокировка», поэтому только один поток может получить к ней доступ одновременно.

Установить блокировку вокруг кода, который обновляет или извлекает объект кэша.

Вот простой класс, который демонстрирует это:

public class UpdateCache
{
   private static object _myLockObject;

   public static void UpdateCache()
   {
     lock(_myLockObject)
     {
        .. Update cache object
     }
   }

   public static void LoadFromCache(string key)
   {
     lock(_myLockObject)
     {
       .. retrieve data from cache
     }   

   }
} 
1 голос
/ 01 октября 2009

Типичным шаблоном является инкапсуляция кэшированного объекта в свойстве. Получатель свойства может затем контролировать весь доступ к кешированному объекту.

private static object _locker = new object();

public static DataSet CachedDataSet
{
    get
    {
        if (Cache["DataSetKey"] == null)
        {
            lock (_locker)
            {
                if (Cache["DataSetKey"] == null)
                {
                    Cache["DataSetKey"] = CreateAndFillDataSet();
                }
            }
        }
        return (DataSet) Cache["DataSetKey"];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...