2010-11-22 16 views
7

Supongamos que tengo un objeto que existe mientras dure una aplicación. Llamémoslo GlobalWorker. GlobalWorker tiene eventos, p. UserLoggedIn al que otros objetos pueden suscribirse. Ahora imagine que tengo una página de Silverlight o una página asp.net o algo así, que se suscribe al evento UserLoggedIn cuando se construye.Manejadores de eventos y objetos de por vida de aplicación en C# - ¿debo desenganchar?

public SomePage() 
{ 
GlobalWorker.Instance.UserLoggedIn += new EventHandler(OnUserLoggedIn); 
} 

private void OnLoggedIn(object sender, EventArgs e) 
{ 

} 

¿La existencia de este evento impide que la página sea recogida de basura? Si es así, ¿cuál es el mejor patrón para usar en esta instancia: manejadores de eventos débiles, mueva la suscripción al evento Load y anule la suscripción en el evento UnLoad?

Respuesta

3

Use Weak Events.

Este es un problema común en WPF y es bueno que lo hayas pensado.

+0

También es un problema común en Windows Forms. –

+0

¡Diablos, incluso un problema es JavaScript! – Gabe

+0

¿Es preferible el patrón de 'evento débil' para simplemente anular el registro del controlador de eventos en las clases de oyentes porque es más general (y requiere menos código [redundante])? –

1

Sí, el comportamiento impide que la página sea GC.

La razón es que UserLoggedIn tendrá una referencia a SomePage indefinidamente. No hay una eliminación explícita del controlador y, dado que weak events no se están utilizando, tampoco se eliminará implícitamente.

Puede utilizar eventos débiles como otro cartel indicó, también puede volver a pensar su diseño hasta cierto punto y ver si puede funcionalizar o encapsular el comportamiento del evento. Quizás los datos son todo lo que necesita ser global en esta instancia (credenciales de usuario), donde el evento se puede mantener aislado.

También puede darse de baja en el controlador si este fue un evento único que le interesó. Realmente se reduce a su necesidad e instancia específica, el patrón de eventos débiles es el patrón para tratar con esta aplicación, pero no significa que tenga que usar ese patrón en cada instancia que surja este problema.

+0

Hay una tendencia a querer recurrir a WeakEvent en muchos lugares ¿no? Quizás esa es una tendencia hacia la pereza, es decir, no pensar en los aspectos de eliminación de su aplicación. Parece que en la mayoría de los lugares un poco de repensar puede eliminar la necesidad del WeakEvent. –

Cuestiones relacionadas