【问题标题】:static variable lifetime and application pool recylcing静态变量生命周期和应用程序池回收
【发布时间】: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


【解决方案1】:

好吧,实在忍不住了,赶紧测试了一下。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2011-04-18
    相关资源
    最近更新 更多