2012-06-20 6 views
6

Я просто удивился этому на днях. Я не совсем уверен, как ASPX управляет удалением мусора, но насколько я могу сказать, «готовая загрузка» не удаляет значения статической памяти или после перезагрузки страницы. Статический, по крайней мере, с точки зрения С означает, что распределение памяти следует за вашей программой до тех пор, пока сама программа не будет отключена. Это то же самое в ASPX? Если у меня есть статическое значение, и я перехожу от страницы А к странице В, статическое значение все еще сохраняется в ОЗУ до тех пор, пока они не покинут приложение или это значение не будет удалено, если я больше не на странице А? (перейдите на другой веб-сайт, удалив свой экземпляр из пула приложений на сервере).Статические объекты в ASP.NET пустой тратой памяти?

Из того, что я испытал:

public static class foo 
    { 
     public static int x; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     foo.x++; //This will continue to increment from the last value before reload 
    } 
+0

http://stackoverflow.com/questions/1714064 –

+0

http://stackoverflow.com/questions/1563171 –

+0

http://stackoverflow.com/questions/3814608 –

ответ

5

Статические классы следует избегать в ASP.NET. Они остаются в памяти до тех пор, пока приложение не будет перезапущено и не подвержено многим ошибкам параллелизма и условиям гонки.

И закрытие сеанса пользователя (сеанс браузера) не перезапускает приложение! Они остаются в памяти, даже если пользователь уходит и возвращается. Так что действительно действительно избегайте статических классов!

+0

Есть ли у вас статью или ссылку на какой-то мере больше касается этой темы? Мне было бы интересно узнать больше об этом. –

+0

Посмотрите на ссылки, которые вы можете найти в комментариях к вашему вопросу. Вы также можете посмотреть здесь http://bytes.com/topic/c-sharp/answers/878381-static-variable-hell-asp-net и здесь http://www.foliotek.com/devblog/avoid-static- variables-in-asp-net/StackOverFlow также содержит множество сообщений. –

+2

Обратите внимание, что, возможно, вам придется использовать статические переменные, если вам действительно необходимо обмениваться информацией между всем вашим приложением. Но я предпочел бы использовать Singleton в этом случае. –

0

Это ваша стандартная модель выполнения CLR, она не отличается для asp.net. Статический объект считается корнями приложения и не собирает мусор.

Это старая статья о том, как сборка мусора работает в .net, но я думаю, что все принципы остаются теми же: http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

Смежные вопросы