静态范围多用户ASP.NET Web应用程序中的变量

时间:2013-01-04 09:59:41

标签: c# asp.net static

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

我有一个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);
    }
}

}

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

4 个答案:

答案 0 :(得分:70)

  

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

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

  

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

之后用户将看到200。

答案 1 :(得分:22)

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

如果你在静态变量中存储一些东西,那肯定是你做错了什么。

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

So better you can store the values in **Sessions**.

答案 2 :(得分:1)

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

public static int customerID
{
    get { return session["customerID"] == null? -1 : (int)session["customerID"]; }
    set { session["customerID"] = value; }
}

答案 3 :(得分:-1)

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

<ChartAreas>
    <asp:ChartArea Name="ChartArea1">
        <AxisX Title="Date" IsLabelAutoFit="True" TitleForeColor="#ff0000">
            <LabelStyle Format="dddd, dd-MM-yy" />
            <MajorGrid Enabled ="False" />
        </AxisX>
    </asp:ChartArea>
</ChartAreas>