在WebApp中使用静态成员

时间:2011-12-21 11:17:07

标签: asp.net

我有这段代码

//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?

2 个答案:

答案 0 :(得分:3)

是的,您可以使用静态变量来存储应用程序范围的数据,但它不是线程安全的。使用Application和[{1}}方法的lock对象代替静态变量。

查看ASP.NET Application Life Cycle Overview for IIS 7.0ASP.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;
        }
    }
}

通过使其成为应用程序变量,它应该能够承受多个页面请求。它有一个漏洞,它不会在应用程序池循环中存活,对于大型应用程序,这可能会有问题。如果你真的希望这个变量可靠地以静态方式运行,你可能最好将其状态存储在某个数据库中。