静态变量生存期和应用程序池回收

本文关键字:程序池 应用程序 应用 变量 生存期 静态 | 更新日期: 2024-10-30 16:53:26

我了解与应用程序(控制台/窗口)相关的静态变量的生存期,但我不确定在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 变量在像示例 2 中一样重新初始化之前将为空是否正确?

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

静态变量生存期和应用程序池回收

好的,所以忍不住,做了一个快速测试。

这与您的示例 1 几乎相同,除了页面输出,所以我可以在不附加到进程的情况下执行此操作,

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

相关文章: