2016-07-10 7 views
1

Ich habe eine Anwendung, die mehrere codefluente Objekte zwischenspeichert. Wenn ich mehrere dieser zwischengespeicherten Objekte in einer temporären Sammlung ablegen, wird die Sammlung nie aus dem Speicher freigegeben. Indem ich die Anwendung mit ANTS profilierte, fand ich den villan: einen eventhandler, der angehängt wird, wenn das Objekt in die Sammlung in der 'BaseAdd'-Funktion der Sammlung eingefügt wird.Codefluent Speicherverlust wegen OnItemKeyChanged-Ereignis

Wie kann ich verhindern, dass dieser Eventhandler angeschlossen wird oder wie kann ich dies aufräumen?

Antwort

1

Der Standardauflistungstyp für eine Entität ist ListCollection. Somit speichert die erzeugte Sammlung die Daten in einer list und einer dictionary. Dies ermöglicht den Zugriff auf ein Objekt über seinen Index oder seinen Schlüssel. Wenn Sie ein Objekt in dieser Sammlung hinzufügen, muss die Sammlung das Ereignis KeyChanged registrieren, damit das Wörterbuch bei Bedarf aktualisiert werden kann. Wenn Sie ein Element aus der Sammlung entfernen, wird das Ereignis aufgehoben.

Wenn Sie niemals mit ihrem Schlüssel auf Elemente zugreifen, können Sie den Sammlertyp in List ändern. Daher gibt es kein Wörterbuch, so dass das Ereignis KeyChanged nicht registriert werden muss.

+0

Ich dachte schon, aber das Problem ist, dass die Sammlung in einer Schnittstelle benötigt wird, die die codefluent Sammlung verwendet. Ich habe das Problem jetzt gelöst, indem ich die Abonnements für den Eventhandler entfernt habe. Siehe Update ... –

0

Ich löste das Problem, indem ich die Eventhandler-Subskriptionen löschte, da ich weiß, dass die Sammlung nie aktualisiert wird. Der OnItemKeyChanged ist privat, also habe ich eine öffentliche Funktion erstellt, die aufgerufen werden kann.

Während die obige Lösung funktionierte, änderte ich schließlich alle Elemente, die ich anstelle von ListCollections in Listen zwischenspeichert. Die Chance, dass jemand dieses Problem vergisst und ein weiteres Speicherleck erzeugt, ist zu groß.

+0

Vorsicht! Das Ändern der Sammlung, um anstelle von listcollection aufzulisten, führt zur Leistung !!! –