静态变量是否在用户会话中保留其值?
我有一个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价值按钮。他认为什么是价值?
答案 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>