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