2008-12-05 12 views
5

¿Se aplican las mismas reglas de prácticas recomendadas para suscribirse o darse de baja en eventos en asp.net?¿Debo anular la suscripción a eventos (manualmente suscritos a) en asp.net?

Sé que podría parecer una pregunta tonta, pero cuando lo pienso, nunca he visto ningún código donde las personas se suscriban por primera vez a un evento en una página y luego se dan de baja más adelante en la solicitud web.

Ejemplo 1: En una página, en el método Page_Load, me suscribo a un evento de actualización en un ListView. ¿Debo cancelar mi suscripción a ese evento más adelante, por ejemplo, en el método OnPreRenderComplete?

Ejemplo 2: En el patrón de vista pasiva, una vista (Control de página/Usercontrol) generará un evento cada vez que necesite que el presentador haga algo. Entonces, el presentador necesita suscribirse a eventos en la vista, pero ¿también necesita darse de baja de los eventos otra vez?

Recuerdos, Egil.

Respuesta

4

La instancia de página y todos sus componentes "saldrán del alcance" cuando finalice la solicitud, p. se vuelven elegibles para GC. Por lo tanto, su ListView quedará fuera del alcance junto con los controles de página/usuario. No necesita darse de baja (a menos que se suscriba a un evento que pertenece a algún tipo de singleton que sobrevive a cada solicitud y utiliza uno de los métodos de la página como el manejador de eventos, por ejemplo).

Lo mismo es válido para el presentador (de nuevo siempre que este presentador se use únicamente con una página y salga del alcance después de eso).

+0

Ok, solo para estar seguro de que lo entiendo correctamente: si tengo un objeto singleton en la caché asp.net, un presentador no debe suscribirse a un evento, ya que el singleton no se eliminará cuando la página se apague de alcance, y el presentador se quedará así? –

+0

Sí, he actualizado la redacción en mi respuesta. Básicamente, no debe dejar ninguna referencia a la página (ni a ningún control en ella) con sus objetos de larga vida. Un controlador de eventos podría ser una referencia. – liggett78

+0

Solo un ejemplo: si se suscribe a un evento de un objeto de larga vida y utiliza uno de los métodos de su página como manejador, entonces su objeto de larga vida contiene una referencia a la página. Para el GC, la página aún está visible/dentro del alcance. Sin embargo, un método estático como controlador de eventos estaría bien. – liggett78

2

En general, no. Se supone que los eventos se descargan automáticamente cuando la página se descarga. Se supone que es. Me encontré con un error antes (en .NET 1.1) donde ese no era el caso.

No me molestaré en cancelar la suscripción, a menos que note un problema con la página (como un método llamado 20 veces desde un fantasma en la pila de llamadas: generalmente es un signo de que algo no se anuló correctamente).

Cuestiones relacionadas