当您将项目添加到System.Web.Caching.Cache具有绝对到期日期时,如下例所示,Asp.Net如何表现?可以:
只需将项目标记为已过期,然后执行CacheItemRemovedCallback下一次访问尝试?
从缓存中删除该项并CacheItemRemovedCallback立即执行?
HttpRuntime.Cache.Insert(key,
new object(),
null,
DateTime.Now.AddSeconds(seconds),
Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable,
OnCacheRemove);
Run Code Online (Sandbox Code Playgroud)MSDN似乎表明它立即发生.例如,"ASP.NET缓存概述"的"过期"部分说"ASP.NET在过期时会自动从缓存中删除项目".类似地,主题"如何:从缓存中删除项时通知应用程序"主题中的示例说"如果在调用GetReport[示例中的方法] 之间超过15秒,ASP.NET将从中删除报告缓存".
尽管如此,这些都不是明确的.他们没有说"回调是立即执行的",我可以设想他们的作者可能认为上面的选项1算作"删除"一个项目.所以我做了一个快速而肮脏的测试,而且,它似乎立即执行 - 即使没有人访问我的网站,我也会定期进行第六十二次回调.
尽管如此,我的测试很快而且很脏,并且在我的回答评论中是否有办法在.Net Web应用程序中每天运行一个进程而无需编写Windows服务或SQL服务器作业,有人建议使用Asp.Net实际上是推迟删除和执行回调,直到某些东西再次尝试访问缓存.
任何人都可以权威地解决这个问题,还是仅仅考虑实施细节?
我System.Web.Caching.Cache在我的网站使用的程序集中使用.我已将一些密钥到期(绝对到期)设置为10秒(仅用于调试).我还在密钥删除时设置了回调.
问题是我看到缓存在20秒而不是10秒后刷新.
我正在使用HttpRuntime.Cache这个.
对于为什么会发生这种情况的任何建议?
我想展示一个代码示例,它可以提供更多的亮点:
public void OnUpdate(string key
, CacheItemUpdateReason reason
, out object expensiveObject
, out CacheDependency dependency
, out DateTime absoluteExpiration
, out TimeSpan slidingExpiration)
{
using (StreamWriter sw = new StreamWriter(@"C:\temp\foo.txt",true))
{
sw.WriteLine("Updated Cache at " + DateTime.UtcNow);
}
expensiveObject = 11;
dependency = null;
absoluteExpiration = DateTime.UtcNow.AddSeconds(3);
slidingExpiration = Cache.NoSlidingExpiration;
}
protected void Page_Load(object sender, EventArgs e)
{
log.WriteInfo("Updated Cache", MethodBase.GetCurrentMethod());
Page.Cache.Insert("foo", (object)11, null, DateTime.UtcNow.AddSeconds(10), Cache.NoSlidingExpiration, new CacheItemUpdateCallback(OnUpdate));
}
Run Code Online (Sandbox Code Playgroud)
在这里,我用过Page.Cache …