2010-01-08 19 views
5

Wenn ich ein Benutzersteuerelement erstellen, das eine CommandBinding zu einem RoutedUICommand hat, besorgt, dass ich Speicherlecks bekomme.Command Binding Speicherverlust in WPF

Szenario:

Haben Sie einen RoutedUICommand als statische in c-Klasse, wo ich meine Befehle speichern die Commandbindings auf einer Benutzersteuerung implementieren. Fügen Sie dem Hauptformular das Benutzersteuerelement hinzu. Entfernen Sie das Benutzersteuerelement aus dem Hauptformular, legen Sie die Verweise auf es auf Null fest.

Der Befehl canExecute der Befehlsbindungen wird weiterhin ausgelöst. Ich habe keinen Hinweis auf das UserControl, so dass es durchgesickert ist. und es feuert für eine lange Zeit, nachdem das Formular geschlossen wurde. (Ich habe es nicht gesehen stoppen) Wenn ich eine Müllsammlung erzwinge, wird es gesammelt (gut die canExecute hört auf zu feuern)

Ich habe einen Test project, der dies veranschaulicht. Ich habe eine Console.WriteLine im canExecute, die den Hashcode des Objekts ausgibt, das die Methode auslöst. Es hat eine Schaltfläche zum Hinzufügen eines neuen Benutzersteuerelements und eines zum Entfernen.

Sollte ich mich nicht darum kümmern? Das Benutzersteuerelement wird gesammelt, wenn er erzwungen wird. bedeutet das, dass es bei der nächsten Sammlung gesammelt wird? Ich merke, Leistungseinbußen in unserer App und Tracking-Speicher-Lecks usw. Wir haben komplizierte Formen mit vielen UI-Elemente und sie hängen herum mit Prozessor und Speicherplatz, wenn aus dem Layout entfernt. (Wir benutzen eine Menge Befehle) Ich dachte, sobald etwas aus dem visuellen Baum entfernt wurde, konnte es keine weitergeleiteten Ereignisse mehr empfangen. Was vermisse ich?

Antwort

1

Aus meinem Verständnis verwenden Befehlsbindungen etwas ähnliches (aber nicht das gleiche) wie die WeakEvent pattern.

Grundsätzlich wird eine WeakReference gehalten. Dies ermöglicht es, nach dem Verwerfen der Referenz zu arbeiten, verhindert jedoch nicht, dass Ihre Klasse vom GC erfasst wird, wenn nichts anderes darauf verweist.

Kurz gesagt, keine Sorge - es funktioniert so, wie es funktionieren soll.