Get всегда возвращает ноль - PullRequest
0 голосов
/ 05 февраля 2020

Моя проблема в том, что добавление ChangeMonitor предотвращает кэш. Get всегда возвращает ноль вместо данных.

Без монитора данные будут возвращены.

У кого-нибудь есть идеи по поводу такого поведения?

try {
    var x = cache.Get(key);

    if (x != null) {
        extendedList = x as List<HistoryInformation>;
        return extendedList;
    }
    data = await _client.NewGetAllLocationHistoryAsync(data);

    list.AddRange(data.List);

    extendedList = extendHistoryList(list);

    CacheItemPolicy policy = new CacheItemPolicy()
    {
        SlidingExpiration = new TimeSpan(0, 1, 0, 0)
    };

    // By the next four lines of code the cache.Get function always returns null!!!

    policy.ChangeMonitors.Add(cache.CreateCacheEntryChangeMonitor(new string[] { cacheName }));
    policy.RemovedCallback = args => {
        log.Info($"GetHistory:{args.CacheItem.Key} ---> {args.RemovedReason}.");
    };

    var v = cache.Add(key, extendedList, policy);

    // Returns null if the lines  "policy.ChangeMonitors.Add ...
    // and                        "policy.RemovedCallback" part of the code.
    var y = cache.Get(key);
}

1 Ответ

0 голосов
/ 06 февраля 2020

Вы попросили удалить элемент из кэша.

Кэширование сложное. Это одна из вещей, которую вы должны очень тщательно реализовать в соответствии с документацией. Как это бывает, вы просите вещи, которые вам не нужны.

ChangeMonitors не относится к объектам, отслеживающим кеш . Он представляет мониторы, которые сообщают, когда кэш должен быть признан недействительным. Например, если у вас есть файл, который вы хотите кэшировать в памяти, вы используете монитор изменения файлов, поэтому, когда файл изменяется на диске, он немедленно становится недействительным в кэше. Для бонусных баллов CacheEntryChangeMonitor немедленно вызовет удаленное уведомление, если ключ не существует в кэше. Соедините эти два поведения вместе и ...

  • Вы создаете новую политику кэширования с монитором изменений, который отслеживает cache для ключа cacheName
  • Ключа нет в кеше с именем, указанным cacheName, поэтому монитор изменений сразу регистрирует элемент как удаленный
  • Элемент кэша добавляется с ключом key. Это успешно, и добавляет элемент в кэш. Однако монитор изменений говорит, что элемент должен быть признан недействительным, поэтому он немедленно удаляется из кэша.
  • Get(key) возвращает значение NULL, как и положено

В итоге: если вы Чтобы отслеживать изменения в кэше, используйте RemovedCallback или CacheEntryChangeMonitor. Если вы хотите сделать недействительным элемент кэша при изменении чего-либо еще, используйте ChangeMonitors.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...