Asp.net 在WebApp中使用静态成员

Asp.net 在WebApp中使用静态成员,asp.net,Asp.net,我有这个密码 //file Globals.cs in App_Code folder public class Globals { public static string labelText = ""; } 还有一个简单的aspx页面,它有文本框、标签和按钮。代码文件是: public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArg

我有这个密码

//file Globals.cs in App_Code folder
public class Globals
{
    public static string labelText = "";
}
还有一个简单的aspx页面,它有文本框、标签和按钮。代码文件是:

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

否,在这种情况下,静态仅在请求所在的流程的生命周期内是静态的。因此,在处理单个请求的整个过程中,这个变量都是静态的。为了以您描述的方式拥有一个“静态”变量,您必须将其设置为应用程序变量。大概是这样的:

//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;
        }
    }
}

通过使其成为应用程序变量,它应该能够经受多个页面请求。不过,它有一个漏洞,即它无法在应用程序池循环中生存,对于大型应用程序来说,这可能会有问题。如果您确实希望此变量以静态方式可靠地运行,那么最好将其状态存储在某个数据库中。

否,在本例中,静态仅在请求所在的流程的生命周期中是静态的。因此,在处理单个请求的整个过程中,这个变量都是静态的。为了以您描述的方式拥有一个“静态”变量,您必须将其设置为应用程序变量。大概是这样的:

//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;
        }
    }
}

通过使其成为应用程序变量,它应该能够经受多个页面请求。不过,它有一个漏洞,即它无法在应用程序池循环中生存,对于大型应用程序来说,这可能会有问题。如果您确实希望此变量以静态方式可靠运行,那么最好将其状态存储在某个数据库中。

是的,您可以使用静态变量存储应用程序范围的数据,但它不是线程安全的。将
应用程序
对象与
锁定
解锁
方法一起使用,而不是使用静态变量


看一看,您可以使用静态变量存储应用程序范围的数据,但它不是线程安全的。将
应用程序
对象与
锁定
解锁
方法一起使用,而不是使用静态变量


查看并

为什么不将此labelText添加到会话中?会话到期时它将被销毁,并且不会在用户之间共享…@emaster70我想问:为什么静态成员在用户之间共享?我也可以在viewstate中保存此值,但问题不在于此,为什么不将此labelText添加到会话中?会话到期时它将被销毁,并且不会在用户之间共享…@emaster70我想问:为什么静态成员在用户之间共享?我也可以在viewstate中保存该值,但问题不在于此