2009-01-20 8 views
8

Ich kann mir ein paar chaotische Wege, um dies zu lösen, denken, aber es scheint mir, dass es eine viel elegantere Lösung als die, die ich bereits gefunden haben sollte.Entfernen Sie Handler auf Entsorgen von Objekt

Was ist die am besten geeignete Methode für ein Objekt, sich von allen Event-Handlern zu reinigen, bevor es entsorgt wird. Es ist eine Schande, dass der Event-Handler nicht aufgezählt werden kann.

In der Theorie gilt es als korrekter für den Code, der den Handler zu einem Objekt hinzufügt, um daran zu erinnern, ihn zu entfernen, als angenommen, dass das Objekt sich selbst bereinigt, bevor es den Gültigkeitsbereich verlässt?

Antwort

9

Theoretisch gilt es richtig für den Code Hinzufügen des Handler zu einem Objekt entfernen Sie es als unter der Annahme, das Objekt säubert sich bis zu erinnern, bevor es den Gültigkeitsbereich verlässt?

Zu der obigen Frage muss ich ja sagen. Die grundlegende Theorie über Ereignisse ist, dass der Ereignisbeschützer nicht für die Verwaltung seiner eigenen Handler verantwortlich sein sollte; Wer auch immer das Ereignis hinzugefügt hat, sollte aufräumen.

+0

Fair genug. Vielen Dank für eine schnelle und hilfreiche Antwort. – Kivin

10

Es gibt eine Möglichkeit, dieses häufige Problem mit Ereignissen zu vermeiden - WeakEvent pattern.

+1

Link ist tot, bitte reparieren Sie es. –

+0

Korrigierter Link für .NET Framework 4: https://msdn.microsoft.com/en-us/library/aa970850(v=vs.100).aspx – arni

0

Event-Handler sind für mich die größte Bedrohung für den Speicherverbrauch einer .NET-Anwendung, besonders wenn Sie sie in einem Web-Server-Kontext verwenden. Für mich ist es immer die Verantwortung des Objekts, das sich anhängen wollte. Ein anhaftendes Objekt sollte immer eine kleinere oder gleiche Lebensdauer haben wie das Objekt, an das es angehängt wird. Andernfalls besteht ein Problem mit der Gestaltung der Ereignisse, da Sie nicht über Änderungen an Objekten informiert werden möchten, die keine Bedeutung mehr haben . Wenn ihre Lebensdauer gleich ist, gehen sie zusammen außer Reichweite und Sie müssen nichts tun, wenn es kürzer ist, als es das anhaftende Objekt lösen muss. In einer grundlegenden Web-Anwendung haben Sie nur 3 Arten von Lebensdauer, Anwendung, Sitzung und Seite und die Regeln sind einfach anzuwenden. Bei komplexeren Anwendungen erfordert dies ein wenig mehr Nachdenken.

5

In meinen Entwürfen bin ich sehr streng über die Definition Verträge wie:

  • jede Ressource Akquisition mit einem Release
  • jeden Anruf gepaart werden muss einen Dienst zu starten, muss mit einem Aufruf gepaart werden, um den Dienst zu beenden
  • jeder Beobachter, die zu einem Thema beimißt muss
  • lösen und so weiter

(Kontrakt s sind nicht ungewöhnlich, so wie Sie das Öffnen und Schließen einer Datei koppeln oder neue Anrufe in Sprachen, die keine automatische Speicherbereinigung verwenden, koppeln oder löschen müssen.

Jeder dieser Verträge kann bis zu einem gewissen Grad zur Laufzeit getestet werden. Zum Beispiel kann ein Beobachter, der sich öfter löst als er angehängt hat, erkannt und gemeldet werden (je nach Situation Asser oder Exception).

Also, Ihre Frage, dass:

Theoretisch betrachtet ist es richtig für den Code Hinzufügen des Handler zu einem Objekt entfernen Sie es als unter der Annahme, das Objekt säubert sich bis zu erinnern bevor es geht außerhalb des Geltungsbereichs?

Ist vor Ort. Die Antwort ist Ja, und zwar nicht nur in der Theorie, sondern auch in der Praxis. Meiner Meinung nach helfen diese Verträge, Kehrfehler unter dem Teppich zu vermeiden.

Verordnen Sie sich auf diese Weise weg denken und Sie sind auf dem besten Weg zum Aufbau wirklich robuster Software.

Verwandte Themen