【发布时间】:2010-11-28 21:20:56
【问题描述】:
当您向System.Web.Caching.Cache 添加具有绝对到期日期的项目时,如下例所示,Asp.Net 的行为如何?是吗:
只需将项目标记为过期,然后在下次访问尝试时执行
CacheItemRemovedCallback?-
从缓存中删除项目并立即执行
CacheItemRemovedCallback?HttpRuntime.Cache.Insert(key, new object(), null, DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, OnCacheRemove);
MSDN 似乎表明它会立即发生。例如,the "Expiration" section of the "ASP.NET Caching Overview" 表示“当项目过期时,ASP.NET 会自动从缓存中删除项目”。同样,主题 "How to: Notify an Application When an Item Is Removed from the Cache" 中的示例表示“如果调用 GetReport [示例中的方法] 之间的间隔超过 15 秒,ASP.NET 将从缓存中删除报告。”
不过,这些都不是明确的。他们没有说“回调立即执行”,我可以想象他们的作者可能如何认为上面的选项 1 算作“删除”一个项目。所以我做了一个快速而肮脏的测试,瞧,它似乎正在立即执行 - 即使没有人访问我的网站,我也会定期收到 60 秒的回调。
尽管如此,我的测试又快又脏,在我对Is there a way to run a process every day in a .Net web application without writing a windows service or SQL server jobs 的回答中,有人建议 Asp.Net 实际上推迟了回调的删除和执行,直到有东西再次尝试访问缓存。
任何人都可以权威地解决这个问题还是这只是一个实现细节?
【问题讨论】:
-
我认为这个问题没有权威的答案,因为正如 Raymond Chen 经常指出的那样,您将一个软件版本的行为解释为对所有未来版本都具有权威性.根据我的经验,这是一个坏主意,因为 ASP.NET 可能随时更改其行为并破坏您的应用程序。
-
你为什么不测试一下。在您的回调中写入文件并查看创建日期以及它与过期的关系。
-
@dkackman - 我不需要“现在和永远”的答案,我愿意接受 .NET 2.0 和 3.5 的权威答案。对我来说,这似乎不仅仅是一个实现细节:我希望文档在某处说,如果是这种情况,实际删除不是确定性的。也许MS不同意。我只是想看看我是否忽略了文档中的某些内容。