2012-06-20 8 views
6

Me lo estaba preguntando el otro día. No estoy exactamente seguro de cómo ASPX gestiona la eliminación de basura, pero hasta donde sé, la "carga finalizada" no elimina los valores de memoria estática o después de que la página se haya recargado. Estático al menos en términos de C significa que la asignación de memoria sigue su programa hasta que el programa se apaga. ¿Es esto lo mismo en ASPX? Si tengo un valor estático y voy de la Página A a la Página B, ¿ese valor estático aún persiste en la RAM hasta que salga de la aplicación o se elimine ese valor una vez que ya no esté en la Página A? (vaya a un sitio web diferente eliminando su instancia del grupo de aplicaciones en el servidor).Objetos estáticos en ASP.NET una pérdida de memoria?

Por lo que he experimentado:

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 –

Respuesta

5

clases estáticas deben ser evitados en ASP.NET. Permanecen en la memoria hasta que se reinicie la aplicación y están sujetos a muchos errores de concurrencia y condiciones de carrera.

¡Y al cerrar una sesión de usuario (sesión del navegador) no se reinicia la aplicación! Permanecen en la memoria incluso si un usuario se va y regresa. ¡Así que realmente realmente evito las clases estáticas!

+0

¿Tiene un artículo o referencia de algún tipo que toca más sobre este tema? Sería interesante aprender más sobre eso. –

+0

Mire los enlaces que puede encontrar en los comentarios de su pregunta. También puede ver aquí http://bytes.com/topic/c-sharp/answers/878381-static-variable-hell-asp-net y aquí http://www.foliotek.com/devblog/avoid-static- variables-in-asp-net/StackOverFlow también tiene muchas publicaciones. –

+2

Tenga en cuenta que A VECES puede necesitar usar variables estáticas si realmente necesita compartir información entre toda su aplicación. Pero preferiría usar un Singleton en este caso. –

0

esta es su modelo de ejecución CLR estándar, que no es diferente de asp.net. Los objetos estáticos se consideran raíces de la aplicación y no son basura.

Este es un artículo de edad sobre cómo funciona la recolección de basura en .NET, pero creo que todos los principios siguen siendo los mismos: http://msdn.microsoft.com/en-us/magazine/bb985010.aspx