应用程序池回收时静态变量的变化及相关触发事件咨询
应用程序池回收相关问题详解
1. 应用程序池回收时,静态变量会发生什么变化?
说白了,所有静态变量的现有值都会彻底丢失。
原因很简单:应用程序池回收的核心操作是卸载当前的AppDomain(应用程序域),而静态变量是跟AppDomain绑定的——它们的内存都在当前AppDomain的托管堆里。当AppDomain被销毁时,CLR会回收这个堆上的所有对象,原来存在静态变量里的值自然就没了。
等新的AppDomain创建起来后,静态变量会重新初始化:如果你的类有静态构造函数,就会执行构造逻辑;如果没有,就会被设为对应类型的默认值(比如int类型是0,引用类型是null)。
2. Global.asax静态变量与回收后的事件触发
先纠正一个常见的误解:应用程序池回收后,当第一个请求打到你的应用时,Application_Start是会重新触发的。你之前听到的“不会触发”应该是混淆了场景——Application_Start在每个AppDomain的生命周期里只跑一次,回收后新的AppDomain启动时,它会再次执行。
现在回到你的具体问题:
回收会导致静态变量的值丢失吗?必须会啊。原来
AppDomain里的静态变量已经被销毁了,新AppDomain里的静态变量是全新的。如果你在Application_Start里给它设了初始值,那这个初始值会被重新设置,但如果回收前你在业务逻辑里修改过静态变量的值(比如某个请求里更新了它),这些修改的内容会完全消失,不会带到新的AppDomain里。回收后还有哪些事件会被触发?
Application_Start:新AppDomain启动时触发一次,用来做应用级的初始化操作Application_BeginRequest:每个进入应用的请求都会触发,是请求处理的第一个环节Application_AuthenticateRequest:当请求进入身份验证阶段时触发Application_AuthorizeRequest:当请求进入授权阶段时触发- 额外提一句:在回收发生之前,还会触发
Application_End事件,用来做一些资源清理工作(不过这个事件的执行时间有上限,如果处理太慢可能会被CLR强制终止)
内容的提问来源于stack exchange,提问作者Aykut Ucar
相关产品推荐
相关产品推荐

