2015-04-17 18 views
4

我有一个简单的访问控制类,允许检查用户有权限后,这则与静态变量相互作用:请问一个静态变量复位时间

private static bool canUpdate = false; 

页面加载 期间这是用来保护无效的Page_Load(对象发件人,EventArgs的)

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

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

这一切都工作得很好,它简单,布尔,以便有条件地显示一个用作另一方法(称为一个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; 
} 

的日期被传递在作为结合表达,传递之前的小区的日期,因此,我知道这不是问题。

这个问题仅在大量时间刷新页面时出现,这是由于静态变量具有生命周期,我只在第一页加载时设置变量?

+7

不,但静态变量的生命周期与其AppDomain相同。如果您使用IIS,那么您的AppDomain最终将被回收。简而言之:不要为Web应用程序使用静态变量。将信息存储在数据库或会话状态中。 – Dirk

回答

2

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

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

这种信息应该存在于ViewStateSession

汲取教训:不要使用static变量来获取用户,会话或页面特定的信息。

3

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

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

0

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