【问题标题】:Navigation of pages and running in the background页面导航和后台运行
【发布时间】:2017-02-04 04:33:14
【问题描述】:

在 UWP (XAML / C#) 中,我使用 Frame.Navigate(typeof(Page2));,在 Page2 的 C# 中,我使用计时器,当我使用 Frame.GoBack(); 时,帧确实返回,但计时器并没有停止 - 我的意思是页面和它的所有组件仍在后台运行,因此该应用程序消耗了过多的 RAM。如何“杀死”页面?

注意:如果用户使用此导航 10 次,页面在后台是 10 次,这是不好的..

【问题讨论】:

  • 你用什么定时器?
  • Windows.UI.Xaml.DispatcherTimer,但这不是定时器的问题(我只是通过_timer.Tick处的定时器和断点找到它,但问题是所有组件和所有页面仍在后台)。
  • 离开页面后不要忘记明确停止计时器。 DispatcherTimer 在运行时在 Dispatcher 和您的页面之间创建一个强引用。
  • 所以在protected override void OnNavigatedFrom 中我将使用_timer.Stop();,但仅此而已?页面的其他组件和数据实体会被垃圾回收器移除吗?
  • 它会,如果没有其他对页面的引用可以防止它被 GC'ed。您还应该寻找对您的页面的任何直接引用、来自静态对象的非取消订阅事件、复杂的数据绑定——所有这些都可能导致内存泄漏。

标签: c# uwp


【解决方案1】:

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

当您启动Windows.UI.Xaml.DispatcherTimer 时,它会将自身添加到当前Dispatcher 内的计时器集合中,从而在Dispatcher 和计时器之间创建直接引用。反过来,计时器持有对其正在运行的页面的引用。由于Dispatcher 是一个全局对象,它会让您的页面保持活动状态,直到计时器停止。

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

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

如果上述方法没有帮助,我建议您使用内存分析器来查找内存泄漏,例如 Visual Studio 2015 中包含的诊断工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2011-08-26
    • 2019-12-03
    相关资源
    最近更新 更多