Nicht registrierte event-Handler Ursache Speicherverlust
Pflege ich eine web-Anwendung, die ein Speicherleck hat.
Basierend auf meiner Untersuchung mit Hilfe von Red Gate ANTS memory profiler-ich bin mir ziemlich sicher, dass der Speicherverlust verursacht durch event-Handler in der business-Schicht.
Gibt es eine Sammlung, die registriert ein Ereignis-handler für jedes Element Hinzugefügt, so dass die Sammlung neu zu Sortieren, wenn das Element für Datum geändert wird. Es scheint, dass dieser event-handler ist der Schuldige.
Den business-Schicht-für diese Anwendung ist Recht kompliziert, so halten Sie der Sammlung und Ihrer Objekte im Speicher zieht eine Reihe von anderen Objekten mit es.
Habe ich implementiert IDisposable auf die Sammlung und entfernt den event-Handler in der Dispose-Methode:
p.OnPunchDateChanged -= this.OnPunchDateChanged;
Aber die Umsetzung von IDisposable nicht helfen, da ich nicht einpacken kann alle Verweise auf die Sammlung zu verwenden oder try/catch-Blöcke. Diese Sammlung wird verwendet, indem Teile der Anwendung, dass ich nicht die Kontrolle über.
Wie lösche ich diese event-Handler zu beheben, dieser Speicherverlust?
- Ich habe eine Frage: haben Sie jemals die Dispose-Methode aufrufen? Oder Sie setzen auf die mithilfe der () - Anweisung zu tun, dass für Sie nur?
Du musst angemeldet sein, um einen Kommentar abzugeben.
First off, nur um zu beweisen der Punkt, versuchen Sie, sich anzumelden hinzufügen und entfernen von Ereignissen, um eine einfache text-Datei. Dann, überprüfen Sie, wie viele wurden Hinzugefügt vs entfernt.
Klingt es so, als wenn es sich um einen Fehler irgendwo in der business-Logik, die nicht die Registrierung der Veranstaltung in allen Lebenslagen.
Die Dispose-Methode auf die collection aufgerufen werden soll, direkt durch Ihren code, weil das Ereignis enthält einen Verweis auf die Sammlung. Ihre Sammlung wird nie zerstört werden, indem der garbage collector.
Sollten Sie auch ändern, das Verhalten der Entfernen und Reinigen Sie die Methoden der Sammlung zu trennen die Ereignis-handler aus der entfernten Elemente.