Asp.NET MVC应用程序中的静态类

时间:2011-10-16 19:47:07

标签: c# asp.net-mvc

我想知道 ASP.NET MVC 应用中的静态类是否可以多次初始化。我最初设计我的应用程序,以便静态组件从数据库中获取一些东西并充当缓存,我向从构造函数调用的类添加了一个刷新方法。刷新方法也通过应用程序的管理部分提供。在某些时候,我注意到数据已更新,无需手动触发,这意味着静态构造函数不止一次运行。

有几种情况我可以合理地看到这种情况发生,例如导致重新初始化的未处理Exception。但我很难复制这个,所以我想肯定地知道。

2 个答案:

答案 0 :(得分:10)

最常见的情况是:

  • 重新加载Web应用程序

    • 触及了Web.config
    • 触及二进制文件
    • 异常终止(内存不足,权限错误)
  • 重新加载应用程序池

  • 重启IIS
  • 重启w3wp.exe(至少29小时一次!)

将重新加载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)

每个AppDomain初始化一次

static个类。

如果IIS回收你的AppDomain,一切都会重新初始化。