C# 页面导航和后台运行

C# 页面导航和后台运行,c#,uwp,C#,Uwp,在UWP(XAML/C#)中,我使用Frame.Navigate(typeof(Page2)),在第2页的C#中,我使用定时器,当我使用Frame.GoBack()时,帧确实返回,但计时器没有停止-我的意思是页面及其所有组件仍在后台运行,应用程序因此消耗了太多内存。我怎样才能“杀死”页面 注意:如果用户使用此导航10次,则该页面在后台显示10次,并且不正确。必须了解,CLR垃圾收集器是负责“杀死”未使用对象的人。对象(及其所有成员)在不再被引用时变为“未使用” 启动Windows.UI.Xaml

在UWP(XAML/C#)中,我使用
Frame.Navigate(typeof(Page2)),在第2页的C#中,我使用定时器,当我使用
Frame.GoBack()时,帧确实返回,但计时器没有停止-我的意思是页面及其所有组件仍在后台运行,应用程序因此消耗了太多内存。我怎样才能“杀死”页面


注意:如果用户使用此导航10次,则该页面在后台显示10次,并且不正确。

必须了解,CLR垃圾收集器是负责“杀死”未使用对象的人。对象(及其所有成员)在不再被引用时变为“未使用”


启动
Windows.UI.Xaml.dispatchermer
时,它会将自身添加到当前
Dispatcher
中的计时器集合中,从而在
Dispatcher
和计时器之间创建直接引用。计时器依次持有对正在运行的页面的引用。由于
调度程序是一个全局对象,它将使页面保持活动状态,直到计时器停止

内存泄漏可能还有其他原因(这是一个相当广泛的话题),包括:

  • 直接或间接引用您页面的其他来源
  • 订阅静态事件
  • 复杂的数据绑定,如
    {Binding Path=Property.subperty}

如果上述方法无效,我建议您使用内存探查器查找内存泄漏,例如Visual Studio 2015中包含的诊断工具。

您使用的计时器是什么?
Windows.UI.Xaml.dispatchermer
,但这不是计时器的问题(多亏了timer和断点在_timer.Tick,我才发现它,但问题是所有组件和所有页面仍在后台)。当您导航离开页面时,不要忘记显式停止计时器。
DispatcherTimer
Dispatcher
和正在运行的页面之间创建一个强引用。因此在
protected override void OnNavigatedFrom
中,我将使用
\u timer.stop()
,但仅此而已?页面的其他组件和数据实体将被垃圾收集器删除?如果没有其他对页面的引用可以阻止对其进行垃圾收集,则会被删除。您还应该查找对页面的任何直接引用、来自静态对象的未取消订阅的事件、复杂的数据绑定——所有这些都可能导致内存泄漏。