【发布时间】:2016-05-02 23:56:46
【问题描述】:
我正在使用 HttpContext.Current.Cache 通过 CacheItemUpdateCallback 缓存昂贵的数据查询。
这个想法是用户必须加载一次数据,然后 updatecallback 保持对象每 30 分钟更新一次。
这就是我插入/覆盖缓存的方式:
HttpContext.Current.Cache.Insert(cacheID, cachedObject, null,
expiryTimeStamp,
Cache.NoSlidingExpiration,
updateCallBack);
出于测试原因,我将过期日期设置为这样(每 20 秒更新一次):
var expiryTimeStamp = DateTime.Now.Add(new TimeSpan(0, 0, 20));
这一切都很好。这意味着,它每 20 秒更新一次昂贵的对象 - 但仅持续大约 25 分钟。然后不再调用触发器“updateCallBack”!
我猜问题是 IIS 处理了缓存,因此不再触发回调“CacheItemUpdateCallBack”......但这只是一个猜测。
这引出了我的问题:
我必须在 app.config 或 IIS 中设置任何设置吗?还是我做错了什么?
编辑: 此外,我不明白为什么带有CacheItemUpdateCallback 的Insert overload 没有参数CacheItemPriority。 但是,overload with CacheItemRemovedCallback 确实有一个优先级参数。也许,如果我可以将 CacheItemPriority 设置为“高”,它已经解决了我的问题。
编辑:我发现了问题:每个应用程序池都有一个空闲超时属性,设置为 20 分钟。
【问题讨论】:
-
你有updateCallback的代码吗?你实现它的方式会影响这一切的工作方式。比如“如果回调方法抛出异常,ASP.NET会抑制异常并移除缓存的值”……也许你25分钟后出于某种原因抛出异常
-
也许您的应用程序域因任何原因被 IIS 回收 (stackoverflow.com/questions/302110/…),因此启动时缓存为空。