静态变量生命周期和应用程序池循环

时间:2013-12-19 00:10:46

标签: c# asp.net .net iis static-variables

我理解与应用程序(控制台/窗口)相关的静态变量的生命周期,但我不确定在web应用程序(asp.net,mvc,web api等)的上下文中我是否了解它们的生命周期

根据我的理解,当IIS回收应用程序池时,静态变量将重置为其类型的默认值(积分= 0,引用类型= null等),但我想知道在回收后是否重新初始化内联初始化程序或者类型默认值是否总是分配?

实施例(一个或多个):

// example 1
static class StaticRandom
{
    private static Random rng = new Random();
}

在上面,在循环后第一次调用静态字段 rng 会重新初始化为新的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 变量将为null,直到重新初始化为止,如示例2所示?

注意:我完全了解上面示例中的线程安全问题,这只是一个简单的例子来说明我的问题。在上述想法的真实场景中,我将实现适当的锁定模式。

1 个答案:

答案 0 :(得分:5)

好的,所以无法帮助自己,并做了快速测试。

这几乎与你的例子1一样,除了页面输出所以我可以在不附加到过程的情况下完成它,

它确认了我的想法 - 静态将重置为内联初始化值。