多用户ASP中静态变量的作用域.. NET web应用程序
本文关键字:作用域 NET web 应用程序 变量 ASP 静态 多用户 | 更新日期: 2023-09-27 17:50:44
静态变量是否在用户会话期间保持其值?
我有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调用Get Value按钮之后。他认为价值是什么?
静态变量是否在用户会话中保持其值?
是的,这就是为什么当你在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; }
}
不要为属性使用static,否则它会工作:
public int customerID
{
get { return Session["customerID"] == null? -1 : (int)Session["customerID"]; }
set { Session["customerID"] = value; }
}