我有这段代码
//file Globals.cs in App_Code folder
public class Globals
{
public static string labelText = "";
}
和一个简单的aspx页面,其中包含文本框,标签和按钮。 CodeFile是:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = Globals.labelText;
}
protected void Button1_Click1(object sender, EventArgs e)
{
Globals.labelText = TextBox1.Text;
}
}
当我点击按钮时,Globals.labelText变量从文本框初始化;问题是:为什么当我在另一个浏览器中打开此页面时,标签具有我在第一个浏览器设置的值,即静态成员对于每个用户都是常见的。我认为每个请求都在由IIS进程的个人副本创建的各个appDomain中提供。 WTF?
答案 0 :(得分:3)
是的,您可以使用静态变量来存储应用程序范围的数据,但它不是线程安全的。使用Application
和[{1}}方法的lock
对象代替静态变量。
查看ASP.NET Application Life Cycle Overview for IIS 7.0和ASP.NET Application Life Cycle Overview for IIS 5.0 and 6.0
答案 1 :(得分:1)
不,在这种情况下,静态仅以该方式为静态,仅适用于请求所依赖的流程的生命周期。因此,在您处理单个请求的整个过程中,此变量将是静态的。为了以您描述的方式获得“静态”变量,您必须使其成为应用程序变量。像这样:
//file Globals.cs in App_Code folder
public class Globals
{
// I really recommend using a more descriptive name
public static string LabelText
{
get
{
return Application("LabelText") ?? string.Empty;
}
set
{
Application("LabelText") = value;
}
}
}
通过使其成为应用程序变量,它应该能够承受多个页面请求。它有一个漏洞,它不会在应用程序池循环中存活,对于大型应用程序,这可能会有问题。如果你真的希望这个变量可靠地以静态方式运行,你可能最好将其状态存储在某个数据库中。