静态变量是否在一段时间后重置

时间:2015-04-17 11:01:05

标签: c# asp.net variables lifetime

我有一个简单的访问控制类,它允许检查用户是否具有权限,然后与静态变量进行交互:

private static bool canUpdate = false;

在页面加载期间使用 protected void Page_Load(object sender,EventArgs e)

{
    if (!Page.IsPostBack)
    {
        AccessControl I = new AccessControl(parameter);

        canUpdate = I.HaveEdit;
    }
    BindGrid();
}

这一切都很好,它很简单,并且bool用作另一个方法的一部分(称为gridview代码表达式),以便有条件地在一行中显示控件。 这也很有用。

但是我处于测试阶段并且我已经意识到在正常操作下一切都很好,但是经过一段时间(很重要,如半小时左右),按钮不再显示(换句话说就是canUpdate已设为假。)

显示代码:

protected bool ShowNewStamps(object date)
{
    //Returns to Bind Expression whether to display Timestamp Link
    if (date == null & canUpdate == true)
        return true;
    else
        return false;
}

日期作为绑定表达式传入,传递之前的单元格日期,因此我知道这不是问题。

这个问题只在页面在很长一段时间后刷新时出现,这是因为静态变量有生命周期而我只在第一页加载时设置变量吗?

3 个答案:

答案 0 :(得分:3)

静态变量在一段时间后不会重置。

最有可能是IIS回收您的应用程序,从而创建一个新的AppDomain和静态。

答案 1 :(得分:2)

static个变量,就像所有其他变量在一段时间内过期一样。这通常取决于IIS中应用程序池的生命周期。

我认为这不是问题所在。 static变量在所有会话中共享。这意味着如果其他人打开另一个会话(或者您使用其他浏览器),则会重置该变量。

此类信息应存在于ViewStateSession

学到的经验:不要将static变量用于用户,会话或页面特定的信息。

答案 2 :(得分:0)

除非您回收应用程序池,否则

静态变量不会重置。静态和非静态变量之间的区别在于,当您定义静态变量时,您可以确保它在应用程序的生命周期中存在,因为它们通过名称高频堆存储在堆中,该高频堆不受GC控制。但在非静态变量的情况下,GC控制它们的存在。