2010-11-22 13 views
7

Angenommen, ich habe ein Objekt, das für die Dauer einer Anwendung existiert. Nennen wir es GlobalWorker. GlobalWorker hat Ereignisse, z.B. UserLoggedIn, auf die sich andere Objekte subskribieren können. Stellen Sie sich vor, ich habe eine Silverlight-Seite oder eine asp.net-Seite oder etwas, das das UserLoggedIn-Ereignis abonniert, wenn es erstellt wird.Eventhandler und Anwendung Lebensdauer Objekte in C# - sollte ich abhaken?

Besteht die Existenz dieses Ereignisses verhindern, dass die Seite Müll gesammelt wird? Wenn ja, welches ist das beste Muster für diese Instanz: schwache Event-Handler, verschieben Sie das Abonnement zum Load-Ereignis und kündigen Sie es im UnLoad-Ereignis ab?

Antwort

3

Verwenden Sie Weak Events.

Dies ist ein häufiges Problem in WPF und es ist gut, dass Sie darüber nachgedacht haben.

+0

Es ist ein häufiges Problem in Windows Forms. –

+0

Heck, es ist sogar ein Problem ist JavaScript! – Gabe

+0

Ist das 'schwache Ereignis'-Muster vorzuziehen, um einfach den Ereignishandler in den Listener-Klassen aufzuheben, weil es allgemeiner ist (und weniger [redundanten] Code benötigt)? –

1

Ja, das Verhalten verhindert, dass die Seite GC wird.

Der Grund dafür ist, dass UserLoggedIn einen Verweis auf SomePage auf unbestimmte Zeit enthält. Es gibt keine explizite Entfernung des Handlers, und da weak events nicht verwendet wird, wird es auch nicht implizit entfernt.

Sie können schwache Ereignisse verwenden, wie ein anderes Poster angibt, Sie können auch Ihr Design zu einem gewissen Grad überdenken und sehen, ob Sie das Evening-Verhalten funktionalisieren oder einkapseln können. Vielleicht müssen alle Daten in diesem Fall global sein (Benutzeranmeldeinformationen), wobei das Ereignis isoliert gehalten werden kann.

Sie können sich auch im Handler selbst abmelden, wenn es sich um eine einmalige Veranstaltung handelt, die Sie interessiert. Es ist wirklich auf Ihre spezifischen Bedürfnisse und Beispiele ausgerichtet. Ein schwaches Ereignismuster ist das Muster, um mit dieser Anwendung umzugehen, bedeutet aber nicht, dass Sie dieses Muster bei jedem Auftreten dieses Problems verwenden müssen.

+0

Es gibt eine Tendenz, an vielen Stellen auf WeekEvent zurückgreifen zu wollen, nicht wahr? Vielleicht ist das eine Tendenz zur Faulheit - d. H. Nicht durch die Entsorgungsaspekte Ihrer Bewerbung nachzudenken. Es scheint, dass an den meisten Orten ein wenig Nachdenken die Notwendigkeit für das WeakEvent beseitigen kann. –