C# 页面导航和后台运行
在UWP(XAML/C#)中,我使用C# 页面导航和后台运行,c#,uwp,C#,Uwp,在UWP(XAML/C#)中,我使用Frame.Navigate(typeof(Page2)),在第2页的C#中,我使用定时器,当我使用Frame.GoBack()时,帧确实返回,但计时器没有停止-我的意思是页面及其所有组件仍在后台运行,应用程序因此消耗了太多内存。我怎样才能“杀死”页面 注意:如果用户使用此导航10次,则该页面在后台显示10次,并且不正确。必须了解,CLR垃圾收集器是负责“杀死”未使用对象的人。对象(及其所有成员)在不再被引用时变为“未使用” 启动Windows.UI.Xaml
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()
,但仅此而已?页面的其他组件和数据实体将被垃圾收集器删除?如果没有其他对页面的引用可以阻止对其进行垃圾收集,则会被删除。您还应该查找对页面的任何直接引用、来自静态对象的未取消订阅的事件、复杂的数据绑定——所有这些都可能导致内存泄漏。