asp.net events garbage-collection page-lifecycle

¿Debo cancelar la suscripción de eventos(manualmente suscritos a) en asp.net?



events garbage-collection (2)

¿Se aplican las mismas reglas de mejores prácticas con respecto a la suscripción / desinscripción de eventos en asp.net?

Sé que podría parecer una pregunta tonta, pero cuando pienso en ello, 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 / Control de usuario) 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?

Saludos cordiales, Egil.


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 detecte un problema con la página (como un método que se llama 20 veces desde un fantasma en la pila de llamadas: eso suele ser un signo de que algo no se anuló correctamente).


La instancia de página y todos sus componentes "saldrán del alcance" cuando la solicitud finalice, por ejemplo, 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 (nuevamente siempre que este presentador se use únicamente con una página y quede fuera del alcance después de eso).