Entfernen Sie die Handler zum Entsorgen des Objekts

8

Ich kann mir ein paar unordentliche Wege vorstellen, um das zu lösen, aber mir fällt auf, dass es eine weitaus elegantere Lösung geben sollte als die, die ich mir schon ausgedacht habe.

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 sich daran zu erinnern, ihn zu entfernen, als davon auszugehen, dass das Objekt sich selbst bereinigt, bevor es den Gültigkeitsbereich verlässt?

    
Kivin 20.01.2009, 09:01
quelle

4 Antworten

9
  

In der Theorie wird es mehr berücksichtigt   korrigieren Sie für den Code, der das hinzufügt   Handler zu einem Objekt, an das man sich erinnern soll   entferne es als angenommen das Objekt   wird sich reinigen, bevor es geht   außerhalb des Geltungsbereichs?

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.

    
Jon Limjap 20.01.2009, 09:04
quelle
10

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

    
aku 20.01.2009 09:08
quelle
5

In meinen Entwürfen bin ich ziemlich streng bei der Definition von Verträgen wie:

  • Jede Ressourcenerfassung muss mit einem Release
  • gepaart sein
  • Jeder Anruf zum Starten eines Dienstes muss mit einem Anruf zum Stoppen des Dienstes
  • verknüpft sein
  • jeder Beobachter, der an ein Subjekt anknüpft, muss sich trennen
  • und so weiter

(Solche Verträge sind nicht ungewöhnlich, so wie Sie das Öffnen und Schließen einer Datei oder das Koppeln neuer / Löschen von Anrufen in Sprachen ohne automatische Speicherbereinigung kombinieren 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 Assert oder Exception).

Also, Ihre Frage, dass:

  

In der Theorie wird es mehr berücksichtigt   korrigieren Sie für den Code, der das hinzufügt   Handler zu einem Objekt, an das man sich erinnern soll   entferne es als angenommen das Objekt   wird sich reinigen, bevor es geht   außerhalb des Geltungsbereichs?

ist genau richtig. Die Antwort ist Ja, und zwar nicht nur in der Theorie, sondern auch in der Praxis. Meiner Meinung nach helfen Ihnen diese Verträge, Fehler unter den Teppich zu kehren.

Schreiben Sie sich diese Denkweise vor und Sie sind auf dem besten Weg, wirklich robuste Software zu entwickeln.

    
Daniel Paull 20.01.2009 10:19
quelle
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 etwas mehr Nachdenken.

    
Koen 20.01.2009 09:16
quelle

Tags und Links