.NET公共静态变量的“生命周期”?

时间:2011-03-10 15:13:39

标签: c# asp.net variables static public

我做了一些实验。在 Login.aspx 按钮的 LoginButton_Click()事件中,我的代码类似于:

MyClass.MyPublicStaticString = LoginNameTextBox.Text;

登录后,FormsAuthentication将转到 Default.aspx 。在Default.aspx上,我在 Page_Load()上有一个代码,如下所示:

Label1.Text = MyClass.MyPublicStaticString.ToString();

等待几分钟后,Label1Text在我的登录超时到期之前变为空,即使

这里发生了什么?

6 个答案:

答案 0 :(得分:15)

静态字段(除非[ThreadStatic])每个应用域一个实例,这意味着:所有请求共享相同的值。您需要在Web应用程序中使用static 特别小心。如果有疑问:不要。

重生; AppDomain;分配给静态字段时不会收集它们,如果App-Pool在IIS中循环使用,它们将会过期。

答案 1 :(得分:3)

可以使用Application State对象。但是,只要应用程序正在运行,它就会保留持续存在的信息。另一方面,会话状态的生命周期与当前用户的访问相关,此后默认为20分钟,以验证他/她不仅仅是暂时吃零食而且使用慢速网络。此外,ApplicationState对所有用户上下文都是可见/可访问的;会话仅在当前用户的上下文中可见且可访问。第三方面,回发在上下文中受限于从服务器发送的最后一页的上下文,因为当浏览器将页面返回到服务器(包括用户操作的结果)时发生回发。 Page的生命周期与Session的生命周期和ApplicationState的生命周期不同,不应混淆任何其他任何一个。

答案 2 :(得分:2)

我从未使用过ASP.NET,但我可以告诉你,静态变量不会过期,或类似的东西。

我最好的是,这与另一个以某种方式重置变量的请求有关,甚至可能重新启动整个应用程序,创建一个全新的内存空间,显然没有以前的静态值。

答案 3 :(得分:1)

你应该真的使用Session State来做这件事 如果不这样做,两个用户在短时间内登录将同时获得最后一个用户的姓名,因为它最后存储在MyPublicStaticString中。

答案 4 :(得分:0)

我认为你的应用程序的Page类在你的网络服务器的内存中不再是你的静态变量消失的原因,但是你的身份验证cookie仍然有效,因为你的asp.net表单身份验证超时可能还没有过期。

答案 5 :(得分:0)

是否可以使用ASP.NET Application State对象,就像在ASP.NET中一样,这也可以在多个回发/会话中保持状态?