我想知道 ASP.NET MVC 应用中的静态类是否可以多次初始化。我最初设计我的应用程序,以便静态组件从数据库中获取一些东西并充当缓存,我向从构造函数调用的类添加了一个刷新方法。刷新方法也通过应用程序的管理部分提供。在某些时候,我注意到数据已更新,无需手动触发,这意味着静态构造函数不止一次运行。
有几种情况我可以合理地看到这种情况发生,例如导致重新初始化的未处理Exception
。但我很难复制这个,所以我想肯定地知道。
答案 0 :(得分:10)
最常见的情况是:
重新加载Web应用程序
重新加载应用程序池
将重新加载app-domain(根据需要重新编译动态部分),这将使任何静态初始化的数据无效。
如果创建静态数据很昂贵,或者避免重新加载AppDomain,应用程序池或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实例正常运行
- 的建议强>
我建议你阅读它:)
答案 1 :(得分:4)
static
个类。
如果IIS回收你的AppDomain,一切都会重新初始化。