【问题标题】:Strange behavior of static variables in a web site网站中静态变量的奇怪行为
【发布时间】:2025-11-27 21:35:01
【问题描述】:

我准备了一个非常简单的网站来演示这种行为。

它有一页有一个按钮和以下代码:

public partial class TestStatic : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    if (!IsPostBack)
    {
        Class1.SetValue();
        Label1.Text = Class1.st.ToString();
    }
  }
  protected void Button1_Click(object sender, EventArgs e)
  {
    Label1.Text = Class1.st.ToString();
  }
}

还有一类:

public class Class1
{
  public Class1()
  {
  }
  public static int st = 0;
  public static void SetValue()
  {
    st = 1;
  }
}

因此,当页面加载时,您会在 Label1 中看到 st=1。如果用户单击按钮,有时您会看到 st=0,有时会看到 st=1。在调试中我看到有时命令

public static int st = 0;

在用户单击 Button 时执行,这就是将 st 更改为零的原因。这种行为我只能在框架 4.5 中重现:它不会在框架 3.5 中发生。有人可以解释一下这种行为吗?

【问题讨论】:

  • 不要那样做。 static web 应用程序中的可变状态永远无法工作。
  • 在框架 3.5 中完美运行
  • 否;当您在 .Net 3.5 中对其进行测试时,它碰巧没有损坏。如果您同时收到两个请求,它将中断。

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


【解决方案1】:

静态数据存在于每个应用程序域实例中。由于托管 (IIS) 可以在网站调用之间卸载应用程序域,因此可能会丢失静态数据。

所以,你真的不应该在网络应用程序中依赖静态。

【讨论】:

    【解决方案2】:

    静态值在单个应用程序域内的类的所有实例之间共享。 如果您使用的是 IIS Express,您的 appdomain 可能会比您想象的更频繁地被回收。

    参考这个:Lifetime of ASP.NET Static Variable

    【讨论】:

    • 因此,通过阅读,解决方案将是:1)类不是 aspx 页面,2)不在 App_Code 目录中和/或(?) 3)使类静态。三个都需要吗?
    • 您实际上想要完成什么?如果要存储全局应用程序状态,请考虑使用 Application["key"] = value;和 var value = (int)Application["key"].如果这只是您尝试为当前用户存储的状态,您应该考虑任何数量的东西,例如 Session、Cookie 或 ViewState,具体取决于您需要的范围。