Asp中的静态类..NET MVC应用
本文关键字:MVC 应用 NET 静态类 Asp | 更新日期: 2023-09-27 18:11:29
我想知道如果一个静态类在一个ASP。. NET MVC应用程序可以初始化多次。我最初设计我的应用程序,使静态组件将从数据库中获取一些东西,并作为缓存,我添加了一个刷新方法,从构造函数调用类。刷新方法也可以通过应用程序的管理部分使用。在某些时候,我注意到数据更新不需要手动触发,这意味着静态构造函数运行不止一次。
在一些情况下,我可以合理地看到这种情况发生,例如未处理的Exception
导致重新初始化。但是我在复制这个时遇到了麻烦,所以我想确定一下。
最常见的情况是:
-
重新加载web应用程序
- 感动. config
- 感动二进制文件
- 异常终止(内存不足,权限错误)
-
重新加载应用程序池
- 重启IIS 重新启动w3wp.exe(至少29小时一次!)
应用程序域将被重新加载(必要时重新编译动态部分),这将使任何静态初始化的数据无效。
如果创建静态数据很昂贵,你可以通过将静态数据持久化在某个地方来解决这个问题,或者避免重新加载AppDomain、Application Pool或IIS服务器。
更新: Phil Haack刚刚在这里发表了一篇相关的博客文章:http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx
- Bye Bye App Domain
- 在解释上述内容方面做得更好。值得注意的是,IIS至少每29小时就会回收它的工作进程,而共享主机会更频繁地回收AppDomain(可能在20分钟的空闲时间内)。
- 所以告诉ASP。NET,"嘿,我在这里工作!"
推荐
- 概述了你可以应用的技术来获得AppDomain关闭的通知- 你可以使用它来让你的Singleton实例行为"正确"
我建议你读一下
static
类每个AppDomain初始化一次。