2017-01-29 3 views
0

In UWP (XAML/C#) verwende ich Frame.Navigate(typeof(Page2));, und in C# von Page2 verwende ich Timer und wenn ich Frame.GoBack(); verwende, geht der Rahmen wirklich zurück, aber der Timer ist nicht gestoppt - I Das bedeutet, dass die Seite und alle ihre Komponenten immer noch im Hintergrund laufen und die App deshalb zu viel RAM verbraucht. Wie kann ich die Seite "töten"?Navigation der Seiten und im Hintergrund laufen

Hinweis: Wenn Benutzer dieser Navigation 10 Mal verwendet, ist die Seite 10-mal im Hintergrund und es ist schlecht ..

+0

Welche Timer in Visual Studio enthalten, wie die Diagnose-Tools hilft verwenden Sie? – Yarik

+0

'Windows.UI.Xaml.DispatcherTimer', aber das ist kein Problem des Timers (Ich finde es nur dank Timer und Breakpoint bei _timer.Tick, aber das Problem ist, dass alle Komponenten und die ganze Seite immer noch im Hintergrund ist) . – Peter

+1

Vergessen Sie nicht, den Timer explizit zu stoppen, sobald Sie von der Seite weg navigieren. 'DispatcherTimer' erstellt einen starken Verweis zwischen' Dispatcher' und Ihrer Seite, wenn diese ausgeführt wird. – Yarik

Antwort

1

Es ist wichtig, dass die CLR Garbage Collector zu verstehen, derjenige ist, der für „Tötung verantwortlich ist "unbenutzte Objekte. Ein Objekt (und alle seine Mitglieder) wird "unbenutzt", wenn es nicht mehr referenziert wird.

Wenn Sie einen Windows.UI.Xaml.DispatcherTimer beginnen, es fügt sich in eine Timer-Sammlung innerhalb des aktuellen Dispatcher somit einen direkten Bezug zwischen dem Dispatcher und den Timer zu schaffen. Der Timer wiederum enthält einen Verweis auf die Seite, auf der er ausgeführt wird. Da das ein globales Objekt ist, wird es Ihre Seite am Leben erhalten, bis der Timer gestoppt wird.

Es können auch andere Ursachen für Speicherverlust sein (es ist ein ziemlich breites Thema), einschließlich:

  • Andere Quellen von direkten oder indirekten Verweisen auf Ihrer Seite;
  • Abonnements für statische Ereignisse;
  • Komplexe Datenbindungen wie {Binding Path=Property.Subproperty};

Ich würde vorschlagen, dass Sie einen Speicher-Profiler verwenden Speicherlecks zu finden, wenn die oben nicht 2015.

Verwandte Themen