MemoryCache UpdateCallback сломан, работает только для просроченных элементов - PullRequest
1 голос
/ 27 июня 2019

MemoryCache UpdateCallback запускается только для просроченных элементов.

Рассмотрим следующий тестовый код:

CacheItem cacheItem1 = new CacheItem("mykey", 1);
CacheItemPolicy policy1 = new CacheItemPolicy();
policy1.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(5);
policy1.UpdateCallback = new CacheEntryUpdateCallback(OnCacheItemUpdate);
MemoryCache.Default.Set(cacheItem1, policy1);

CacheItem cacheItem2 = new CacheItem("mykey", 2);
CacheItemPolicy policy2 = new CacheItemPolicy();
policy2.AbsoluteExpiration = DateTimeOffset.UtcNow.AddSeconds(15);
policy2.UpdateCallback = new CacheEntryUpdateCallback(OnCacheItemUpdate);
MemoryCache.Default.Set(cacheItem2, policy2);

public void OnCacheItemUpdate(CacheEntryUpdateArguments args)
{
    // fires only for expired, but not for removed or replaced
}

При запуске этого кода OnCacheItemUpdate будет срабатывать только после истечения срока действия элемента через ~ 15 секунд, но не при его замене с1 -> 2.

Мне кажется, что это ошибка, потому что CacheEntryUpdateArguments.RemovedReason может отличаться от Expired.RemovedCallback работает правильно, как и ожидалось.

Кроме того, время истечения кажется немного задержанным, а не точно 15 секунд.

Это известная ошибка или она каким-то образом задумана?Или я что-то упустил?

...