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