【问题标题】:When does a PhoneApplicationPage get disposed?PhoneApplicationPage 何时被释放?
【发布时间】:2011-07-20 21:24:31
【问题描述】:

例如,如果我有这样的页面:

public partial class Page1 : PhoneApplicationPage
{
    DispatcherTimer timer = new DispatcherTimer();

    public Page1()
    {
        InitializeComponent();

        timer.Interval = TimeSpan.FromSeconds(5);
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
         MessageBox.Show("timer tick"); 
    }
}

在应用程序中,我导航到此页面,它会每 5 秒弹出一个消息框。 然后我按下手机上的“返回”按钮并导航回上一页。 但奇怪的是,它仍然每 5 秒弹出一个消息框。 我知道我可以在 OnNavigatedFrom 方法中停止计时器,但为什么会这样呢? 页面不是按后退键就被释放了吗?

谢谢

【问题讨论】:

  • 遇到了同样的问题,不明白为什么
  • +1:正如我们在调查这个问题时发现的那样:stackoverflow.com/questions/6762606/… 当您离开页面时,页面不会被处理掉。

标签: silverlight windows-phone-7 navigation dispose


【解决方案1】:

当没有任何东西保持唤醒时,它会被 GC 处理掉。这个 DispatcherTimer 让它保持清醒,即使它是由页面创建的。我过去的猜测是 DispatcherTimer 被 Dispatcher 本身引用,因此无法清理,或者类似的东西。

为了演示添加一个finalize方法

#if DEBUG
  ~MyPage() {
    System.Diagnostics.Debug.WriteLine("Killing MyPage");
  }
#endif

然后在主页的某处添加一个按钮来强制GC.Collect()

如果您关闭OnNavigatedFrom 中的计时器,您的页面将被清理,如果您不这样做,则不会。

我还没有用 Mango 测试过它是否更智能,但是使用 7.0 工具我必须做一些工作才能解决这个问题。

【讨论】:

  • +1 用于间接澄清另一个问题的原因:stackoverflow.com/questions/6762606/…
  • 只要对象的方法绑定到计时器,DispatcherTimer 就会使对象保持活动状态。 (来自 MSDN)
【解决方案2】:

我认为因为dispatcher timer的生命周期比页面长,而且一个好习惯是停止或取消事件处理程序,所以页面有内存泄漏。我研究gc,这是一个有点困难的话题...... .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2011-08-27
    • 2013-05-24
    • 2011-05-20
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多