【发布时间】:2014-01-07 09:34:33
【问题描述】:
我了解与应用程序(控制台/窗口)相关的静态变量的生命周期,但我不确定在 Web 应用程序(asp.net、mvc、web api 等)的上下文中是否了解它们的生命周期.
据我了解,当 IIS 回收应用程序池时,静态变量会重置为其类型的默认值(整数 = 0,引用类型 = null 等),但我想知道内联初始化程序是否在回收后重新初始化还是无论如何都会分配类型默认值?
示例:
// example 1
static class StaticRandom
{
private static Random rng = new Random();
}
在上面,静态字段 rng 会在回收后第一次调用时重新初始化为 new Random() 吗?或者我是否需要在尝试使用变量之前执行空检查,例如:
// example 2
static class StaticRandom
{
private static Random rng = null;
public static Next()
{
if (rng == null)
rng = new Random();
return rng.Next();
}
}
我是否正确假设在 IIS 回收后,示例 1 中的 rng 变量将为空,直到像示例 2 中那样重新初始化?
注意:我完全了解上述示例中的线程安全问题,这只是一个简单的示例来说明我的问题。在上述想法的真实场景中,我将实现一个适当的锁定模式。
【问题讨论】:
-
这不是一件很难的事情,你自己试试吧。在示例 1 的
Next方法中放置一个断点,然后查看您在循环后得到的rng的值。 -
我认为只要求澄清比加载我的本地服务器并在等待它进入回收站时玩弄我的拇指 15 分钟要容易得多,哈哈。此外,有时人们会记住一些很高兴知道的小问题。
-
“等待它进入一个回收”:打开IIS并自己回收应用池?
-
大声笑!这是漫长的一天......
-
大声笑 - 我在英国 - 算出现在几点了!! ;-)
标签: c# asp.net .net iis static-variables