asp.net缓存和回收工作进程

时间:2011-03-15 16:41:01

标签: asp.net caching iis-6

所以我注意到只要工作进程被回收,就会清除HttpContext.Cache。我有一个回调,它会在缓存项到期时将其重新插入缓存。但是,当流程被回收时,似乎不会发生这种情况。

我在Application_Start内有一个调用,它将相应的项添加到缓存中,但在回收工作进程后似乎没有调用。是否有回调我可以用来在回收时重新填充缓存,或者它应该是Application_Start?另外,我如何在本地测试?

我很确定我在这里做错了。

3 个答案:

答案 0 :(得分:4)

工作流程回收可以看作停止并启动持有.Net的流程。所有AppDomain数据都将丢失。

根据我的理解,Application_Start仅在第一个请求到达时执行。我希望即使在回收后,这种行为也是一样的。

但是如果它没有执行(有趣),那么你总是可以在其他地方触发它。有很多方法可以做到这一点。例如Application_BeginRequest或第一次加载时引用的任何静态类的ctor。

请注意,HttpContext.Cache实际上只是一个静态对象,因此您可以简单地在初始化完成后更改static bool isInitialized = false;,并将其保留在请求之间。如果放置得很好lock() {},它应该可以顺利运行(因此两个请求不会启动两次初始化)。

我通常解决的方法是按需缓存。不适合所有解决方案。我还使用Enterprise Framework或AppFabric为缓存设置超时(TTL)。

答案 1 :(得分:1)

当AppDomain被回收时,所有程序集都被卸载,因此所有数据都被清除。当应用程序重新启动时,它基本上就像从头开始,没有办法(据我所知)以这种方式重新填充缓存。

这与停止和启动应用程序不同,后者基本上保存了应用程序的状态,并在重新启动时恢复了之前的状态(包括缓存)。

我唯一能想到的就是禁用应用程序回收,但不建议这样做,因为最终会有不断增加的缓存大小,这将成为瓶颈。您可以将数据持久保存到不同的缓存机制,例如SQL数据库。

答案 2 :(得分:-1)

CacheItemPriority枚举有一个“NotRemovable”选项,可防止在垃圾回收期间从缓存中删除该项。

来自MSDN:

  

具有此优先级的缓存项目不会自动进行   当服务器释放系统内存时从缓存中删除。然而,   具有此优先级的项目将与其他项目一起删除   根据项目的绝对或滑动到期时间。