49

静态变量是否在用户会话中保留其值?

我有一个 ASP.NET Web 应用程序,其中有两个按钮。一个用于设置静态变量值,另一个用于显示静态变量值。

namespace WebApplication1
{   

public partial class WebForm1 : System.Web.UI.Page
{
    public static int customerID;

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void ButtonSetCustomerID_Click(object sender, EventArgs e)
    {
        customerID = Convert.ToInt32(TextBox1.Text);
    }

    protected void ButtonGetCustomerID_Click(object sender, EventArgs e)
    {
        Label1.Text = Convert.ToString(customerID);
    }
}

}

虽然这适用于单用户环境,但如果有 2 个用户同时从两台计算机登录会发生什么情况,用户 1 将值设置为 100,然后用户 2 将值设置为 200。在用户 1 调用获取值按钮之后。他会看到什么价值?

4

4 回答 4

76

静态变量是否在用户会话中保留其值?

是的,这就是为什么在 Web 应用程序中使用静态变量时应该非常小心的原因。您将在并发问题中运行,因为为请求提供服务的多个线程可以修改变量的值。

虽然这适用于单用户环境,但如果有 2 个用户同时从两台计算机登录会发生什么情况,用户 1 将值设置为 100,然后用户 2 将值设置为 200。在用户 1 调用获取值按钮之后。他会看到什么价值?

之后用户将看到 200 个。

于 2013-01-04T10:04:03.897 回答
25

静态变量范围是应用程序级别。

如果您将某些内容存储在静态变量中,那么您肯定做错了什么。

如果一个用户保存数据(在静态变量中),同时另一个用户访问同一页面,那么他将获得相同的数据(保存第一个用户)。

So better you can store the values in **Sessions**.
于 2013-01-04T10:03:20.513 回答
1

这对您有用(请记住,您需要处理空值/-1):

public static int customerID
{
    get { return session["customerID"] == null? -1 : (int)session["customerID"]; }
    set { session["customerID"] = value; }
}
于 2014-06-04T16:37:16.983 回答
0

不要对属性使用静态然后它可以工作:

public int customerID
{
    get { return Session["customerID"] == null? -1 : (int)Session["customerID"]; }
    set { Session["customerID"] = value; }
}
于 2015-06-15T09:49:12.530 回答