In einer Klasse, ClassA, habe ich ein Timer-Objekt. In dieser Klasse registriere ich die Event-Handler für das abgelaufene Timer-Ereignis. In einer anderen Klasse, ClassB, habe ich einen öffentlichen Event-Handler für das abgelaufene Timer-Event. So melde ich das Event-Handler von ClassB in KlasseA wie folgt:Was passiert, wenn ein Ereignis ausgelöst wird und versucht, einen Event-Handler in einem Objekt auszuführen, das nicht mehr existiert?
myTimer.Elapsed += ClassBInstance.TimerElapsed
Was passiert, wenn ich eine neue Instanz von ClassBInstance und der Timer abgelaufen-Ereignis ausgelöst zu schaffen waren, als die vorherige Instanz ClassB Veranstaltungs-Handler noch ist an das Elapsed-Ereignis des Timers gebunden?
Zum Beispiel:
ClassB classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
In der Tat. Aus diesem Grund sind statische Ereignisse besonders gefährlich. Es ist sehr einfach, eine große Anzahl von Objekten am Leben zu erhalten, wenn Sie sich nicht religiös abmelden. Mindestens Instanzenereignisse sterben mit der Instanz, die das Unterstützungsfeld enthält - aber kein GC für Statik. –
Es ist auch erwähnenswert, dass WPF springt durch Reifen, um dies mit WeakEvents zu vermeiden, die IMHO sind zu kompliziert und benötigen einige Sprachunterstützung. – Josh