我正在尝试使用MemoryCache
.net 4.5 中的 a 来跟踪并自动更新各种项目,但似乎无论我设置什么,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;
}