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

Does a static variable reset after a time

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

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 已设置为 false)。

显示代码:

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

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

仅当页面在很长一段时间后刷新时才会出现此问题,这是由于静态变量具有生命周期而我只在第一页加载时设置变量吗?

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

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

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

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

这种信息应该存在于ViewStateSession

经验教训:不要将 static 变量用于特定于用户、会话或页面的信息。

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