Кэш памяти не работает в .Net Framework 4 - PullRequest
0 голосов
/ 20 октября 2018

Мой проект построен на .Net Framework 4.0, и мы используем встроенный ObjectCache как MemoryCache, который реализован в System.Runtime.Caching.

Ранее он работал нормально, но внезапно прекратил сохранятьчто-нибудь в кеше.Когда я вызываю метод Set в кеше, он ничего не сохраняет, а Result View всегда пуст, указывая Enumeration yielded no results.Я дважды проверил код и не нашел подвоха там.Это действительно так просто, как показано ниже:

var policy = new CacheItemPolicy();
cache = new MemoryCache("MyCache");
cache.Set("item", "item value", policy);
var item = cache.Get("item");
cache.Remove("item"); //when removal is required

Однако пример приложения, ориентированного на .Net Framework 4 на той же машине, работает.Мне было интересно, если кто-то еще испытал подобное поведение, и как я мог добраться до сути этой проблемы?Есть ли какой-нибудь инструмент, чтобы помочь?

1 Ответ

0 голосов
/ 20 октября 2018

Я наконец нашел причину ошибки.Я выбрасывал контейнер, в котором находился контролируемый контейнером экземпляр Cache.Когда контейнер утилизировал, он также уничтожал мой кеш.И не удалось установить значения для удаленного объекта кэша.Это должно было вызвать исключение, но этого не произошло, отсюда и вся путаница.Будущие читатели, пожалуйста, имейте в виду.

var CachingPolicy = new CacheItemPolicy();
var Cache = new MemoryCache("YourCacheName");
container.RegisterInstance(CachingPolicy);
container.RegisterInstance(Cache);

container.Dispose(); //disposes cache as well. But calling methods on cache object won't throw exception.

//at this point, you should create the cache again, like
CachingPolicy = new CacheItemPolicy();
Cache = new MemoryCache("YourCacheName");
container.RegisterInstance(CachingPolicy);
container.RegisterInstance(Cache);

Дальнейшее копание в MemoryCache коде через ILSpy очистило это, он ничего не установит, если объект будет удален.

if (IsDisposed)
{
    if (collection != null)
    {
        foreach (ChangeMonitor item in collection)
        {
            item?.Dispose();
        }
    }
}
else
{
    MemoryCacheKey memoryCacheKey = new MemoryCacheKey(key);
    MemoryCacheStore store = GetStore(memoryCacheKey);
    store.Set(memoryCacheKey, new MemoryCacheEntry(key, value, absExp, slidingExp, priority, collection, removedCallback, this));
}
...