Merkwürdiger wpf Speicherleck

Ich habe ein seltsames Problem mit einem Speicherverlust durch ein MenuItem in wpf.

Ich kann diesen Speicherverlust im .net-Speicherprofiler beobachten.

Unsere Anwendung hat die folgende Architektur:

Ein MainWindow, in dem Daten für einen ApplicationPresenter erstellt werden. ApplicationPresenter ist für die gesamte Lebensdauer der Anwendung gültig. ApplicationPresenter verfügt über einen MainPresenter, der im Wesentlichen eine Datei und deren Inhalt darstellt. Beim Laden einer Datei (Lösung) wird ein neuer Hauptvortragender erstellt und der alte weggeworfen.

Die Datenvorlage für den Anwendungspräsentator sieht folgendermaßen aus:

    <DataTemplate DataType="{x:Type ApplicationPresenter}">
        <ContentPresenter Content="{Binding Presenter}"/>
    </DataTemplate>

MainPresenter hat eine Reihe von Registerkarten, aber im Grunde ist seine Datenvorlage ein großes Menü in einem DockPanel. Das Menü enthält oben einige verschachtelte Elemente, z. B. Datei, Bearbeiten, Ansicht ..., und in Datei befinden sich die Optionen Neu, Öffnen ... und dann Untermenüs wie Importieren, die dann selbst eine Reihe von Elementen enthalten.

Alle diese Moderatoren implementieren INotifyPropertyChanged und wir haben eine Implementierung von ICommand, die die damit verbundene Verrücktheit umgeht (im Allgemeinen lecken Befehle nicht in der Anwendung).

Was ich jedoch sehe, ist, dass beim Öffnen einer neuen Lösung (oder einer anderen Operation, die einen neuen MainPresenter erstellt) der ursprüngliche MainPresenter (der erste, der beim Laden der Anwendung erstellt wird) im Speicher über das Feld _submenuPopup von MenuItem! Ich habe das Bild vom Profiler angehängt, um zu zeigen, was ich meine:

Diagramm des Lecks

Die Anzahl der Instanzen überschreitet nicht zwei, wenn mehr Operationen ausgeführt werden, und es ist immer der erste Presenter, der sich im Speicher befindet. Die Menüs funktionieren alle (einschließlich der Elemente in den Untermenüs)

Kennt jemand dieses Problem und weiß, wie man es lösen kann?

Es ist nicht massiv kritisch, da nur eine Lösung bedeutet, dass es nicht zu einer OutOfMemoryException führt. Es kann jedoch sehr teuer sein, da das Programm durch Doppelklicken auf Dateien geöffnet werden kann (dh der erste Präsentator kann eine große Datenmenge speichern), wodurch möglicherweise die Speichernutzung unnötig verdoppelt wird.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage