Время жизни статической переменной ASP.NET
Я держу некоторую информацию в статических переменных, определенных в классе страницы (не в Global.asax). Я объявляю переменную только в коде:
protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;
и определите переменную в событии PageLoad. Например, я проверяю идентификатор из базы данных, если он отличается от SomeGlobalUnsecureID, я обновляю SomeGlobalUnsecureID и String откуда-то еще, в противном случае оставляю их как есть. Это совершенно безопасно в моем приложении. логика (то есть эти данные не защищены, доступ к ним может получить каждый, нет проблем); Единственное, чего я хочу достичь, это
Держите один и тот же объем памяти независимо от того, подключены пользователи
Изменяйте в том и только в том случае, если постоянная информация отличается от информации в "памяти" (потому что чтение строки занимает у меня много времени.
Теперь, поскольку я делаю проверку в 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 одним из следующих способов.
- Пул решит, что нужно сделать перекомпиляцию.
- Вы открываете файл app_offline.htm
- Вы делаете ручной перезапуск бассейна
- Пул достигнет некоторых ограничений, которые вы определили, и выполните перезапуск.
- По какой-либо причине вы перезапустите 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);
}
}