Dans une classe, ClassA, j'ai un objet timer. Dans cette classe, j'inscris les gestionnaires d'événements pour l'événement écoulé par minuterie. Dans une autre classe, ClassB, j'ai un gestionnaire d'événements public pour l'événement écoulé par minuterie. Donc j'enregistrer le gestionnaire d'événements de classe B en ClassA comme suit:Que se passe-t-il lorsqu'un événement se déclenche et tente d'exécuter un gestionnaire d'événements dans un objet qui n'existe plus?
myTimer.Elapsed += ClassBInstance.TimerElapsed
Et si je devais créer une nouvelle instance de ClassBInstance et l'événement se déclenche écoulé de la minuterie lorsque l'instance précédente de gestionnaire d'événements de classe B est encore lié à l'événement Elapsed du timer?
Par exemple:
ClassB classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
En effet. En particulier, c'est la raison pour laquelle les événements statiques sont si dangereux; il est très facile de garder un grand nombre d'objets en vie si vous ne vous désinscrivez pas religieusement. Au moins les événements d'instance meurent avec l'instance qui contient le champ de sauvegarde - mais pas de GC pour la statique. –
Il est également intéressant de mentionner que WPF saute à travers les cerceaux pour éviter cela avec WeakEvents qui sont à mon humble avis trop compliqués et ont besoin d'un soutien linguistique. – Josh