[英]Scope of static Variable in multi-user ASP.NET web application
静态变量是否在用户会话中保留其值?
我有一个 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 调用“获取值”按钮之后。 他会看到什么价值?
静态变量是否在用户会话中保留其值?
是的,这就是为什么在 Web 应用程序中使用静态变量时应该非常小心的原因。 您将遇到并发问题,因为为请求提供服务的多个线程可以修改变量的值。
虽然这在单用户环境中有效,但如果有 2 个用户同时从两台计算机登录会发生什么,用户 1 将值设置为 100,然后用户 2 将值设置为 200。在用户 1 调用“获取值”按钮之后。 他会看到什么价值?
之后用户将看到 200。
静态变量范围是应用程序级别。
如果您将某些内容存储在静态变量中,那么您肯定做错了。
如果一个用户保存数据(在静态变量中),同时另一个用户访问同一个页面,那么他将获得相同的数据(第一个用户保存)。
So better you can store the values in **Sessions**.
这对您有用(请记住,您需要处理空值/-1):
public static int customerID
{
get { return session["customerID"] == null? -1 : (int)session["customerID"]; }
set { session["customerID"] = value; }
}
不要对属性使用静态然后它工作:
public int customerID
{
get { return Session["customerID"] == null? -1 : (int)Session["customerID"]; }
set { Session["customerID"] = value; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.