Я пытаюсь использовать MemoryCache
в .net 4.5 для отслеживания и автоматического обновления различных элементов, но, похоже, независимо от того, что я установил как AbsoluteExpiration
, он всегда будет истекать через 15 секунд или больше.
Я хочу, чтобы элементы кэша истекали каждые 5 секунд, но они всегда истекают не менее 15 секунд, и если я выберу время истечения срока действия, это будет примерно как 15 секунд + мой интервал обновления, но не менее чем 15 секунд.
Есть ли какое-то внутреннее разрешение таймера, которое я не вижу? Я просмотрел немного отраженного кода System.Runtime.Caching.MemoryCache
, и мне ничего не выделялось, и я не смог найти кого-нибудь другого, у кого есть эта проблема в Интернете.
У меня есть очень простой пример ниже, который иллюстрирует проблему.
То, что я хочу, для CacheEntryUpdate
ударяться каждые 5 секунд или около того и обновлять новыми данными, но, как я уже сказал, он только получает удар через 15 секунд.
static MemoryCache MemCache;
static int RefreshInterval = 5000;
protected void Page_Load(object sender, EventArgs e)
{
if (MemCache == null)
MemCache = new MemoryCache("MemCache");
if (!MemCache.Contains("cacheItem"))
{
var cacheObj = new object();
var policy = new CacheItemPolicy
{
UpdateCallback = new CacheEntryUpdateCallback(CacheEntryUpdate),
AbsoluteExpiration = DateTimeOffset.UtcNow.AddMilliseconds(RefreshInterval)
};
var cacheItem = new CacheItem("cacheItem", cacheObj);
MemCache.Set("cacheItem", cacheItem, policy);
}
}
private void CacheEntryUpdate(CacheEntryUpdateArguments args)
{
var cacheItem = MemCache.GetCacheItem(args.Key);
var cacheObj = cacheItem.Value;
cacheItem.Value = cacheObj;
args.UpdatedCacheItem = cacheItem;
var policy = new CacheItemPolicy
{
UpdateCallback = new CacheEntryUpdateCallback(CacheEntryUpdate),
AbsoluteExpiration = DateTimeOffset.UtcNow.AddMilliseconds(RefreshInterval)
};
args.UpdatedCacheItemPolicy = policy;
}