Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.NET MVC应用程序中的静态类_C#_Asp.net Mvc - Fatal编程技术网

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

C# Asp.NET MVC应用程序中的静态类,c#,asp.net-mvc,C#,Asp.net Mvc,我想知道ASP.NET MVC应用程序中的静态类是否可以多次初始化。我最初设计我的应用程序是为了让一个静态组件从数据库中获取一些东西并充当缓存,然后我向类中添加了一个从构造函数调用的刷新方法。刷新方法也可以通过应用程序的管理部分使用。在某个时刻,我注意到数据是在不需要手动触发的情况下更新的,这意味着静态构造函数会运行多次 有几种情况下,我可以合理地看到这种情况发生,例如未处理的异常导致重新初始化。但是我在复制时遇到了问题,所以我想确定一下。static类在每个AppDomain中初始化一次 如果

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


有几种情况下,我可以合理地看到这种情况发生,例如未处理的
异常
导致重新初始化。但是我在复制时遇到了问题,所以我想确定一下。

static
类在每个AppDomain中初始化一次


如果IIS回收您的AppDomain,所有内容都将重新初始化。

最常见的情况是:

  • 重新加载web应用程序

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

  • 重新启动IIS
  • 重新启动w3wp.exe(至少每29小时一次!)
应用程序域将被重新加载(根据需要重新编译动态部分),这将使任何静态初始化的数据无效

如果创建静态数据的成本很高,您可以通过将静态数据持久化到某个位置来解决这个问题,或者避免重新加载AppDomain、应用程序池或IIS服务器

更新:菲尔·哈克刚刚在这里发布了一篇相关的博客文章:

  • 再见应用程序域
    • 它在解释上述方面做得更好。值得注意的是,IIS将至少在29小时内回收其工作进程,而共享主机将更频繁地回收AppDomain(可能在20分钟的空闲时间内)
  • 告诉ASP.NET,“嘿,我在这里工作!”
    • 概述了可用于获得AppDomain关闭通知的技术-您可以使用此技术使单例实例“正确”运行
  • 建议

我建议您阅读:)

确保您的类是完全线程安全的。IIS可以在需要时回收我的AppDomain吗?可以;它可以也将如此。我相信这在某种程度上是可配置的。我正在使用Azure,将自己从IIS配置中抽象出来;但这很好。更新:菲尔·哈克刚刚在这里发布了一篇相关的博客文章:。我更新了答案,以反映收集到的信息。我最近发现,我的问题是由于重新加载应用程序池超时,这将杀死已停用20分钟或更长时间的应用程序。这是在WindowsAzure上,帮助我解决了我的问题。