2011-06-20 18 views
5

Dado que todos los controles en un WebForm se destruyen (según tengo entendido) al final de cada devolución de datos, necesita "desconectar" cualquier controlador de eventos que pueda tener ¿cableado? (Asumiendo que desea dejar de manejar los eventos y permitir GC)¿Necesita "manipular" manejadores de eventos en formularios web ASP.NET

Así, por ejemplo:

public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Do I need to remove this handler? 
     btnSubmit.ServerClick += btnSubmit_ServerClick; 
    } 
} 

Respuesta

3

Poco probable. La duración de la instancia WebForm1 finaliza justo después del evento Descargar, si no recuerdo mal. No es como si hubiera una referencia continua a su clase WebForm1 después de que se haya servido la página y se haya realizado la limpieza.

2

No, usted no tiene que hacerlo. Serán basura recolectada.

0

Logré hacer una aplicación web (WebForm) una vez con controles dinámicos, tuve que "deshacerme" de mis eventos, de lo contrario, la página se volvió cada vez más lenta. las "viejas" páginas que pensé que el CG había cuidado, todavía estaban alrededor. Cuando desconecté el evento en Page_Unload, mi aplicación ya no siguió publicando el evento para las páginas inexistentes.

Esto solo me ha pasado una vez, y probablemente se debió a la naturaleza dinámica de la aplicación.

Sólo para la reflexión :)

0

Es demasiado simplista asumir un formulario Web es de corta duración - en este ejemplo se mira bien, pero en general hay que tener cuidado.

Hoy en día, me encontré con un buen ejemplo similar a @thmsn donde la falla al desvincular a los controladores de eventos en una aplicación ASP.NET WebForms estaba causando una desagradable pérdida de memoria.

En este caso, una página maestra utilizada en casi todas las páginas se suscribía al evento de un objeto en su página_Inicio. El objeto en cuestión era de larga duración y persistió en la sesión ASP.NET y el sitio se configuró para usar la tienda de sesión InProc con un tiempo de espera de 60 minutos. Si no se desinstalaba el controlador de eventos, significaba que el objeto impedía GC todas las páginas a las que se accedió durante la sesión durante todo el tiempo que duró (al menos una hora en cada caso).

La solución rápida era desenvolver el controlador de eventos en Page_Unload: este ejemplo muestra que la duración de una página puede extenderse inconscientemente más allá de su vida útil. No entraré en el uso de Session aquí, aunque estaba lejos de ser ideal, y he visto errores similares introducidos con referencias de objetos con tiempos de vida apropiadamente más largos que los de la Página también.

+0

Tener un controlador de eventos no extiende la vida útil del objeto con el evento de ninguna manera, extiende la vida útil del objeto que tiene el controlador mientras el objeto con el evento esté activo, por lo tanto, la situación que describe no es posible El objeto que tiene debe ser tanto hacer referencia a la página (y no al revés). – Servy

+0

Error tipográfico simple: suscribirse al evento (no controlador) del objeto. Corregido ¡Y créeme que tengo el! Dumpheap para probar la fuga! Saludos :) Suscribirse al evento en el objeto en sesión significa que el objeto tenía la referencia de regreso a la página, y lo mantuvo con vida. –

+0

La suscripción de un controlador de eventos a un evento no da como resultado que el manejador tenga una referencia al objeto que definió el evento. Podrías haber creado explícitamente tal referencia en tu caso; es bastante fácil de hacer, pero no necesariamente ocurre como resultado de la suscripción al evento, lo que significa que cancelar la suscripción al controlador del evento tampoco eliminaría su problema.Ahora bien, si la instancia de su página suscribió un controlador de eventos a algún otro objeto que duró mucho tiempo, entonces * that * mantendría la página en todo el tiempo que el otro objeto esté presente, pero esa es una situación diferente. – Servy

Cuestiones relacionadas