【问题标题】:How do static properties work in an asp.net environment?静态属性如何在 asp.net 环境中工作?
【发布时间】:2011-04-30 22:03:31
【问题描述】:

如果我的类具有在用户加载特定页面时设置的静态属性,那么该静态值对于该用户会话是否唯一?

换句话说,如果第二个用户随后加载页面并设置静态属性,每个用户会有不同的值,还是都使用第二个用户值?

【问题讨论】:

  • 您是否阅读过文档或自己尝试过?

标签: c# asp.net static properties


【解决方案1】:

静态对于应用程序域是唯一的,该应用程序域的所有用户将共享每个静态属性的相同值。当您看到静态一词时,请想“只有一个实例”。该实例持续多长时间是一个单独的问题,但简短的回答是它是可变的。

如果您想存储特定于用户的值,请查看Session State

【讨论】:

    【解决方案2】:

    除了鲍勃的回答,当然还有这个例外:

    public static object Item {
        get { return HttpContext.Current.Session["some_key"]; }
    }
    

    【讨论】:

    • 和许多其他人:例如HttpContext.Current 本身,以及DateTime.Now。静态字段是共享的(除非用ThreadStatic 属性修饰),但静态属性可以为所欲为。
    【解决方案3】:

    静态字段和属性在类的所有实例之间共享。您的所有用户最终将共享相同的价值。

    该值将一直存在,直到 ASP.NET 工作进程自行回收(周期性发生)。

    【讨论】:

    • +1 -- 我被咬过一次,愚蠢地删除了针对静态属性的赋值逻辑。价值停留了足够长的时间,让我几乎忘记了它,并且当游泳池确实实际上回收时,可以尽情放松。故事的寓意:在任何情况下都要小心静态,尤其是在 ASP.NET 中。
    【解决方案4】:

    不,这没什么特别的,因为它是 asp.net。 ASP.NET 本身只是一个常规的 .NET 程序集集合。如果您想为每个会话保存内容,那么您应该使用会话状态。如果没有,请小心,因为有许多线程可以访问您的静态数据。您应该阅读并了解线程、锁和竞争条件如何协同工作。

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 1970-01-01
      • 2020-04-11
      • 2014-04-30
      • 1970-01-01
      • 2017-02-25
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多