En una clase, Clase A, tengo un objeto de temporizador. En esta clase, registro los manejadores de eventos para el evento transcurrido del temporizador. En otra clase, ClassB, tengo un controlador de eventos público para el evento transcurrido del temporizador. Así que registrar el controlador de eventos de ClassB en claseA de la siguiente manera:¿Qué sucede cuando se desencadena un evento e intenta ejecutar un controlador de eventos en un objeto que ya no existe?
myTimer.Elapsed += ClassBInstance.TimerElapsed
¿Qué ocurre si tuviera que crear una nueva instancia de ClassBInstance y ha transcurrido el tiempo activa el evento cuando la instancia anterior del controlador de eventos de ClassB sigue siendo vinculado al evento transcurrido del temporizador?
Por ejemplo:
ClassB classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
Indeed. En particular, esta es la razón por la cual los eventos estáticos son tan peligrosos; es muy fácil mantener una gran cantidad de objetos vivos si no se da de baja religiosamente. Al menos los eventos de instancia mueren con la instancia que contiene el campo de respaldo, pero no el GC para estadísticas. –
También vale la pena mencionar que WPF salta a través de aros para evitar esto con WeakEvents que en mi humilde opinión son demasiado complicados y que necesitan un poco de soporte de idiomas. – Josh