当您将项目添加到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实际上是推迟删除和执行回调,直到某些东西再次尝试访问缓存.
任何人都可以权威地解决这个问题,还是仅仅考虑实施细节?
如果我运行一个片段,如:
bool areTheyTheSame = DateTime.UtcNow == DateTime.Now
Run Code Online (Sandbox Code Playgroud)
我会得到什么?DateTime返回知道它的时区,以便我可以比较吗?
我的具体问题是我正在尝试构建类似缓存的API.如果需要DateTime AbsoluteExpiration,我是否必须强制我的API用户知道是给我一个UTC时间还是基于时区的时间?
[编辑]这个问题与我的问题非常相关:Cache.Add绝对到期 - 是否基于UTC?
[编辑]为了澄清未来的读者,DateTimeKind是不同的.未定义的DateTimeKind通常是一个问题,例如,当您从数据库中取出一个时,就会得到这个问题.在DateTime构造函数中设置DateTimeKind ...
[编辑] JonSkeet写了一篇可爱的博客文章,谴责这种行为并提供解决方案:http://noda-time.blogspot.co.uk/2011/08/what-wrong-with-datetime-anyway.html