1

Ich entwickle eine UWP-App für Windows 10. Ich habe ein Problem mit der Speicherverwaltung in meiner App. Ich habe eine SplitView, deren Inhalt viele Bilder enthalten wird. Wenn der Benutzer auf ein Bild klickt, wird das Bild in voller Größe in den Bereich geladen. Ich registriere mich direkt bei vielen Click and Tapped Events in XAML. Wenn ich die Speicherbelegung überprüfe, steigt sie weiter und nach einem Punkt stürzt die App ab. Die Frage, die ich habe, ist, muss ich die Registrierung aller Ereignisse, die ich in XAML für die Freigabe von Speicher registrieren? Ich habe versucht, GC.Collect() zu nennen, aber das löst das Problem nicht. Ich denke, dass es ein Speicherleck geben könnte. Es gibt mehrere Seiten in der App und wenn der Benutzer Schaltflächen außerhalb der SplitView auswählt, ändert sich der Inhalt, und wie melde ich die Registrierung der auf dieser Seite registrierten Ereignisse ab, bevor der SplitView-Inhalt eine andere Seite erhält.Umgang mit Speicher in Universal Windows-Anwendungen in Windows 10

EDIT:

Die XAML für die ganze Seite mehr als 300 Zeilen sind, so kann ich es nicht hier einfügen. Aber die Ereignisse werden wie folgt registriert

<Button Name="Sample" Tapped="Sample_Tapped" Content="Sample Button" /> 

Die Seite wird jedes Mal neu erstellt. Es wird nicht zwischengespeichert. Ich habe einen Frame innerhalb des SplitView-Inhalts, der jedes Mal geändert wird, wenn der Benutzer den angezeigten Bildausschnitt ändern möchte.

MainFrame.Navigate(typeof(ImagePage),"SampleSection"); 

Wenn der Benutzer Abschnitt ändert, nenne ich den Garbage Collector

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
    { 
     GC.Collect(); 

    } 

Aber kein Speicher freigegeben wird.

+0

Benötigt weitere Informationen. Wie registrieren Sie sich für die Veranstaltungen? Wird die Seite bei jedem Besuch neu erstellt? Tritt das Leck selbst dann auf, wenn der Benutzer auf der Seite bleibt, ohne sie erneut zu laden? – Stilgar

+0

Ich habe weitere Informationen hinzugefügt. Verstehe, dass ich den ganzen Code nicht einfügen kann. Es ist zu lang. Ich weiß nicht, warum die Müllsammlung nicht funktioniert. –

+0

Sie wissen, dass es Tools namens Memory Profiler gibt? Benutze einen von ihnen. Z.B. Ameisen Memory Profiler ist einer der am einfachsten zu bedienenden. PerfView ist ein kostenloser Profiler, der übrigens der Beste ist, aber eine hohe Lernkurve hat. –

Antwort

0

Ich denke, diese Zeile das Problem verursacht:

MainFrame.Navigate(typeof(ImagePage),"SampleSection");

Sie neue Seite jedes Mal Benutzer erstellen halten ein Bild auswählen. Es wird Gedächtnisüberstunden auffressen.

Die Lösung aktualisiert die Seite mit neuen Daten (neuer DataContext?) Und erstellt keine neuen. Eine andere Lösung besteht darin, den Navigationsstapel des MainFrames zu löschen, wenn Sie eine neue Seite mit der Eigenschaft BackStack benötigen.

Set NavigationCacheMode in XAML auf "Erforderlich" kann auch helfen, aber es ist nicht die Wurzel des Problems.

+0

Ich verstehe, was du sagst. Korrigiere mich, wenn ich falsch liege, aber wenn ich jedes Mal eine neue Seite erstelle, sollte der alte Seitenspeicher recycelt werden, richtig? es passiert nicht. –

+0

Es sollte nicht klar sein, denn Sie werden es brauchen, um Ereignis zurück zu gehen, wenn Sie tatsächlich nicht. – thang2410199

+0

Der Back-Stack ist sicherlich nicht endlos, so dass es nicht zu Out of Memory Exception führen sollte. Den Versuch wert, vielleicht ist die Seite schwer. – Stilgar

Verwandte Themen