c# - 静态变量生命周期和应用程序池回收

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

我了解与应用程序(控制台/Windows)相关的静态变量的生命周期,但我不确定我是否了解它们在 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 非常相似,除了页面输出,所以我可以在不附加到流程的情况下完成,

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

关于c# - 静态变量生命周期和应用程序池回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671150/

相关文章:

c# - 多个应用程序域调用同一个非托管 dll

c# - ASCII + Numpad 组合为 power 10

javascript - 如何允许 ASP.NET 使用 CORS

.Net 问题 "Illegal characters in path."

c# - .Net 在编译时将类常量设置为其命名空间

c# - 如何以编程方式查找 .NET 运行时版本?

c# - SignalR 在 Azure 生产槽中间歇性停止

javascript - 为什么asp按钮的javascript click()函数在chrome浏览器中不起作用?

c# - DropDownList 导致错误 : Object reference not set to an instance of an object

c# - 在 VS 2013 中使用报表查看器