WeakReference und Ereignisbehandlung
Ist es eine gute Praxis zu implementieren der Ereignisbehandlung durch WeakReference, wenn dieses Ereignis ist das einzige, was hält die Referenz und dass wir Sie brauchen würden, das Objekt von der garbage Collection?
Als argument an:
Leute sagen, dass wenn Sie sich auf etwas, was es in Ihrer Verantwortung, zu kündigen und Sie sollten es tun.
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist gut, in der Gewohnheit der Abmeldung von Veranstaltungen, wenn Sie können, aber manchmal gibt es nicht eine offensichtliche "cleanup" - Methode, wo es getan werden kann. Wir haben vor kurzem verzeichnete einen blog-Artikel zu diesem Thema; es umfasst Methoden, die machen es einfach, zu abonnieren, zu einer Veranstaltung mit einer WeakReference.
InformationsquelleAutor der Antwort Ed Ball
Schwach delegate-Muster ist etwas, das sollte es in der CLR. Normale Termine Ausstellung "Benachrichtigen Sie mich, während Sie lebendig sind" - Semantik, während oft müssen wir "Benachrichtigen Sie mich, während ich noch am Leben bin". Nur mit Delegierten auf die WeakReference ist falsch, denn die delegate ist ein Objekt auch, und auch wenn die Empfänger noch am Leben und haben eingehende Verweise, delegieren, sich selbst nur referenziert werden, sagte WeakReference und werden sofort eingesammelt. Sehen diesem alten post ein Beispiel für die Umsetzung.
InformationsquelleAutor der Antwort Ilya Ryzhenkov
Schwachen Referenzen in Ihrem eigenen Recht, Sie lösen nicht das problem, da der Delegierte hält die Referenz. In der Composite Application Library, die Schiffe mit Prism (www.microsoft.com/compositewpf) es ist ein WeakDelegate Klasse, die Sie ziehen konnte aus der Quelle. Die WeakDelegate im Grunde ues Reflexion und erstellt einen Delegaten nur für einen moment in der Zeit und dann gibt es damit kein halten jegliche Hinweise. Innerhalb CAL ist Sie durch die EventAggregator-Klasse, aber Sie sind frei, es zu zerreißen, sich für Ihre eigenen Nutzung, wie es unter MS-PL.
InformationsquelleAutor der Antwort Glenn Block
Während das, was Sie vorschlagen, löst eine Reihe von Problemen (Ereignis-Referenz-management-und memory-leak-prevention), ist es wahrscheinlich, um eine neue Reihe von Problemen.
Ein problem, das ich sehen kann, ist bei event-handling-Prozess, wenn das source-Objekt bei der Speicherbereinigung (wie es war, nur statt mit einer schwachen Referenz), code, der Zugriff auf das Quell-Objekt Ergebnis in null-Verweis-Ausnahme. Sie können argumentieren, dass die event-handler sollten entweder keinen Zugriff auf das source-Objekt, oder es muss eine starke Referenz, aber es kann argumentiert werden, dass dies ein Schlimmeres problem als die, die Sie versuchen zu lösen, in den ersten Platz.
InformationsquelleAutor der Antwort Samuel Kim