PhoneApplicationPage何时处理?

Cui*_*崔鹏飞 9 navigation silverlight dispose windows-phone-7

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

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"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

在应用程序中,我导航到此页面,它将每5秒弹出一个消息框.然后我按下手机上的"后退"按钮并导航回上一页.但奇怪的是它仍然每5秒弹出一个消息框.我知道我可以在OnNavigatedFrom方法中停止计时器,但为什么会这样呢?按下后退按钮后页面是否处理完毕?

谢谢

Chr*_*nty 9

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

要演示添加finalize方法

#if DEBUG
  ~MyPage() {
    System.Diagnostics.Debug.WriteLine("Killing MyPage");
  }
#endif
Run Code Online (Sandbox Code Playgroud)

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

如果你关闭OnNavigatedFrom页面中的计时器将被清理,如果你没有,它将不会.

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