PhoneApplicationPage何时处理?

时间:2011-07-20 21:24:32

标签: silverlight windows-phone-7 navigation dispose

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

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方法中停止计时器,但为什么会这样呢? 按下后退按钮后页面是否处理完毕?

由于

2 个答案:

答案 0 :(得分:9)

当没有任何东西让它保持清醒时,它会被GC处理掉。即使它是由页面创建的,此DispatcherTimer也会保持清醒状态。我在过去的猜测是DispatcherTimer正在由Dispatcher本身引用,因此无法清理,或者沿着这些行进行清理。

演示添加finalize方法

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

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

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

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

答案 1 :(得分:2)

我认为因为调度程序计时器的使用寿命比页面长,并且一个好的habbit停止或取消eventhandler,所以页面有内存泄漏。我研究gc,这是一个有点困难的话题....