Продолжительность жизни ASP.NET статическая переменная


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

protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;

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

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

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

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

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

3 61

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, или бассейн.

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

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

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

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);
    }
}