例如,如果我有这样的页面:
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方法中停止计时器,但为什么会这样呢? 按下后退按钮后页面是否处理完毕?
由于
答案 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,这是一个有点困难的话题....