Время жизни статической переменной ASP.NET

Я держу некоторую информацию в статических переменных, определенных в классе страницы (не в Global.asax). Я объявляю переменную только в коде:

protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;

и определите переменную в событии PageLoad. Например, я проверяю идентификатор из базы данных, если он отличается от SomeGlobalUnsecureID, я обновляю SomeGlobalUnsecureID и String откуда-то еще, в противном случае оставляю их как есть. Это совершенно безопасно в моем приложении. логика (то есть эти данные не защищены, доступ к ним может получить каждый, нет проблем); Единственное, чего я хочу достичь, это

  1. Держите один и тот же объем памяти независимо от того, подключены пользователи

  2. Изменяйте в том и только в том случае, если постоянная информация отличается от информации в "памяти" (потому что чтение строки занимает у меня много времени.

Теперь, поскольку я делаю проверку в PageLoad, у меня нет проблем с перезагрузкой страниц. Однако моя страница полна WebMethods, и иногда я вижу, что статические переменные обнуляются. И странная часть есть; сеанс все еще активен, даже когда статические переменные обнуляются (поэтому -> перезапуск сервера или приложения. и т. д.)

Это действительно странно для меня. Я предполагаю, что статическая переменная будет держать свое значение до тех пор, пока приложение (каким-то образом) не закончится. Но даже сеанс не истек, статическая переменная обнуляется. Что ты предлагаешь? Использование переменных приложения - лучший выбор? Все документы, которые я читал в Интернете, предлагают статические переменные, а не переменные приложения. Нужно ли объявлять их как-то иначе?

3 ответа

Решение

Статические переменные сохраняются в течение всего срока службы приложения. Таким образом, две вещи, которые приведут к сбросу ваших статических переменных, это перезапуск домена приложения или использование нового класса. В вашем случае со статическими переменными, хранящимися в классе страницы aspx, вы можете потерять статические переменные, когда ASP.NET решит перекомпилировать страницу aspx в новый класс, заменив старый класс страницы новым.

По этим причинам, если система решит перезапустить или заменить класс ( .NET не уничтожает и не выгружает классы / сборки в работающем домене приложения), тогда ваши статические переменные будут сброшены, потому что вы получаете новый класс с перезапуском или заменой. Это относится как к ASPX-страницам, так и к классам в папке App_Code

ASP.NET заменит класс, если по какой-либо причине сочтет необходимым его перекомпилировать ( см. Динамическая компиляция ASP.NET).

Вы не можете предотвратить потерю статических переменных при перезапуске домена приложения, но вы можете попытаться избежать его замены класса. Вы можете поместить ваши статические переменные в класс, который не является страницей aspx и не находится в каталоге App_Code. Вы можете разместить их наstatic classгде-то в вашей программе.

public static class GlobalVariables
{
    public static int SomeGlobalUnsecureID;
    public  static string SomeGlobalUnsecureString;
}

Статические переменные относятся к пулу, то есть если у вас есть 2 пула, на которых работает ваш сайт asp.net, у вас есть 2 разные статические переменные. ( Режим веб-сада)

Статические переменные будут потеряны, если система перезапустит ваше приложение asp.net одним из следующих способов.

  1. Пул решит, что нужно сделать перекомпиляцию.
  2. Вы открываете файл app_offline.htm
  3. Вы делаете ручной перезапуск бассейна
  4. Пул достигнет некоторых ограничений, которые вы определили, и выполните перезапуск.
  5. По какой-либо причине вы перезапустите IIS или пул.

Эти статические переменные не являются потокобезопасными, и вам нужно использовать ключевое словоlock, особенно если вы обращаетесь к ним из разных потоков.

Поскольку перезапуск приложения сбрасывает ваши статические значения, независимо от того, что, если вы действительно хотите сохранить свои данные, вы должны хранить данные в базе данных, используя пользовательские классы. Вы можете хранить информацию о пользователе в состоянии сеанса в режиме состояния сеанса базы данных. ASP.NET Application State/Variables не поможет вам, потому что они хранятся в памяти, а не в базе данных, поэтому они теряются при перезапуске домена приложения.

Я думаю, что следующие два момента также важны для времени жизни статических переменных:

1 - В расширенных настройках пула приложений установите флажок "Переработка" -> "Регулярный интервал времени (минуты)". По умолчанию используется значение 1740, что означает, что каждые 29 часов ваши статические переменные теряются из-за повторного использования пула приложений. Этот параметр используется для устранения возможных утечек памяти. Я бы не стал менять эту настройку..

2 - В расширенных настройках пула приложений проверьте настройку "Модель процесса" -> "Время ожидания (минуты)". Значение по умолчанию равно 20, что означает, что каждые 20 минут бездействия в пуле приложений рабочие процессы завершаются / приостанавливаются, что приведет к потере статических переменных. Этот параметр используется для освобождения ресурсов, когда пул приложений не используется в течение некоторого времени. Вы можете установить его на 0, чтобы отключить тайм-аут.

Статическая переменная используется для хранения всего объекта с одинаковым значением

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);
    }
}
Другие вопросы по тегам