首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET静态变量的生存期

ASP.NET静态变量的生存期
EN

Stack Overflow用户
提问于 2012-01-19 07:31:25
回答 3查看 98.2K关注 0票数 81

我在页面类(而不是Global.asax)定义的静态变量中保存了一些信息。我只在如下代码中声明变量:

代码语言:javascript
复制
protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;

并在PageLoad事件中定义变量。例如,我检查数据库中的ID,如果它不同于SomeGlobalUnsecureID,我会从其他地方更新SomeGlobalUnsecureID和String,否则就让它们保持原样。这在我的应用程序中是非常安全的。逻辑(即这些数据不安全,每个人都可以访问它们,没有问题);我唯一想要完成的事情是

如果且仅当持久信息与‘connected

  • Change’中的信息不同时,无论用户是谁,
  1. 都会保持相同的内存量(因为实际读取字符串对我来说很耗时。

现在,因为我在PageLoad中进行了检查,所以在重新加载页面时没有问题。然而,我的页面充满了WebMethods,有时我会看到静态变量被清零。奇怪的是,即使静态变量被清零,会话仍然是活动的(所以->没有服务器或应用程序。池重新启动等)

这对我来说真的很奇怪。我假设静态变量将保持它的值,直到应用程序(以某种方式)结束。但是,即使会话没有过期,静态变量也会被置零。你有什么建议?使用应用程序变量是更好的选择吗?我在web上读到的所有文档都建议使用静态变量而不是应用程序变量,我是否需要以某种方式声明它们不同?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-19 08:01:46

静态变量在应用程序域的生命周期中持续存在。因此,导致静态变量“重置”的两件事是应用程序域重启或使用新类。在使用存储在aspx Page类中的静态变量的情况下,当ASP.NET决定将aspx Page重新编译为新类,并用新的页面类替换旧的页面类时,您可能会丢失静态变量。

由于这些原因,如果系统决定重新启动或替换类(.NET doesn't kill or unload classes/assemblies in a running app domain),那么您的静态变量将重置,因为您将通过重新启动或替换获得一个新类。这既适用于aspx页面也适用于classes in the App_Code folder

如果出于任何原因认为需要重新编译一个类(see ASP.NET dynamic compilation),ASP.NET将替换它。

您无法防止应用程序域重启造成的静态变量丢失,但您可以尝试通过类替换来避免这种情况。您可以将静态变量放在一个不是aspx页面且不在App_Code目录中的类中。您可能希望将它们放在程序中的某个static class上。

代码语言:javascript
复制
public static class GlobalVariables
{
    public static int SomeGlobalUnsecureID;
    public  static string SomeGlobalUnsecureString;
}

静态变量是每个池,这意味着如果你有两个池运行你的asp.net站点,你就有两个不同的静态变量。(Web garden mode)

如果系统以这种方式重新启动asp.net应用程序,静态变量就会丢失。

  1. 池决定需要重新编译。
  2. 你打开 app_offline.htm 文件
  3. 您手动重新启动池
  4. 池达到您定义的一些限制并重新启动。
  5. 出于任何原因,您重新启动 iis 或池。

这些静态变量不是线程安全的,特别是当你从不同的线程访问它们时,你需要使用lock关键字。

由于应用程序重启无论如何都会重置统计,如果您真的想要持久化数据,则应该使用自定义类将数据存储在数据库中。您可以使用database session state modeSession State中存储每个用户的信息。由于they are stored in memory, not the database,ASP.NET应用程序状态/变量将不会对您有所帮助,因此它们也会在应用程序域重新启动时丢失。

票数 110
EN

Stack Overflow用户

发布于 2016-07-22 15:56:02

我认为以下两点对于静态变量的生命周期也很重要:

1-在应用程序池的高级设置中,检查“循环”->“常规时间间隔(分钟)”设置。它的默认值是1740,这意味着在每29小时内,您的静态变量会因为应用程序池的回收而丢失。此设置用于终止可能的内存泄漏。我不会更改此设置..

2-在应用程序池的高级设置中,检查“进程模型”->“空闲超时(分钟)”设置。它的默认值是20,这意味着在应用程序池中每20分钟处于不活动状态时,工作进程将终止/挂起,这将导致静态变量丢失。此设置用于在一段时间内未使用应用程序池时释放资源。您可以将其设置为0以禁用超时。

票数 21
EN

Stack Overflow用户

发布于 2014-08-13 11:47:17

静态变量用于存储相同值的所有对象

代码语言:javascript
复制
protected void Page_Load(object sender, EventArgs e)
{
    sss s1, s2;
    s1 = new sss();
    s1.TotalMark = 10;
    s2 = new sss();
    s2.TotalMark = 20;
    sss.SchoolName = "St.Joseph's Hr.Sec.S"; //We can access through class and assign common to all
    s1.PrintData();
    s2.PrintData();
}

public class sss
{
    public static string SchoolName { set; get; }
    public int TotalMark { set; get; }
    public string StudentName{set;get;}
    public void PrintData()
    {
        Console.WriteLine(TotalMark);
        Console.WriteLine(SchoolName);
        Console.WriteLine(StudentName);
    }
}
票数 -12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8919095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档