Время жизни статической переменной ASP.NET - PullRequest
70 голосов
/ 19 января 2012

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

protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;

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

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

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

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

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

Ответы [ 3 ]

92 голосов
/ 19 января 2012

Статические переменные сохраняются в течение всего срока службы приложения. Таким образом, две вещи, которые приведут к сбросу ваших статических переменных, - это перезапуск домена приложения или использование нового класса. В вашем случае со статическими переменными, хранящимися в классе страницы 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 не поможет вам, потому что они хранятся в памяти, а не в базе данных , поэтому они теряются при перезапуске домена приложения.

15 голосов
/ 22 июля 2016

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

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

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

0 голосов
/ 13 августа 2014

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

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...