删除页面Windows手机

我有一个大项目,我的应用程序保留了一个我导航离开的页面。 该页面仅使用最少,并且有很多图形,因此我希望它完全从内存中删除。

因此,我使用了以下内容

NavigationService.RemoveBackEntry(); 

使用分析器我看到了,上面的代码段确保我只有1个页面实例。 但由于图形繁重,我仍然希望将其从内存中完全删除,即分析器中没有实例。

在我的大应用程序中,我试图取消订阅所有事件,引入dispose / finalize并调用GC,它帮助了一些但实例仍然存在。

为了排除任何愚蠢的错误,我已经做了这个小样本 。 仅使用内存弹出检查器在两个哑页之间导航。 但仍然存在1-2个页面实例。 反正有没有强制删除页面,以至于没有任何内容存储在内存中?

我已经添加:

  while (App.RootFrame.RemoveBackEntry() != null) ; 

到OnNavigated到,它删除除了我开始的第一页以外的所有页面。 我已经使用了调试分析工具包,并且可以看到,无论我开始的第一页是什么都没有被删除,当我离开它时。

WP Silverlight运行时在内存中最多可保留三个页面,即使从后台堆栈中删除也是如此。 我仍然不清楚这种行为的原因,但我发现了一个(丑陋的)解决方法: http : //blogs.codes-sources.com/kookiz/archive/2013/11/11/wpdev-give-that-内存back.aspx

基本上,覆盖页面的OnNavigatedTo处理程序,并强制垃圾收集三次,通过调用调度程序分开:

 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); this.Dispatcher.BeginInvoke(() => { GC.Collect(); GC.WaitForPendingFinalizers(); this.Dispatcher.BeginInvoke(() => { GC.Collect(); GC.WaitForPendingFinalizers(); this.Dispatcher.BeginInvoke(() => { GC.Collect(); GC.WaitForPendingFinalizers(); }); }); }); } 

虽然听起来很疯狂,但它确实有效。


在你的情况下,你有另一个问题。 您通过弹出窗口保持页面处于活动状态。 让我解释:

CreatePopups方法中,您可以创建弹出窗口并将其添加到起始页面的网格中。 在弹出窗口中,您启动一​​个计时器以定期调用UpdateMemoryInfo 。 计时器由.NET运行时保持活动状态,直到它停止。 计时器会保留对弹出窗口的引用,因为您正在使用实例方法作为事件处理程序。 您的弹出窗口是通过Parent属性保持对网格的引用。 网格通过其自己的Parent属性保持对页面的引用。 因此,只要你的计时器正在滴答作响,你就会让你的页面不朽。 要certificate问题存在,只需将UpdateMemoryInfo方法设置为静态(并删除其中的所有UI更新代码)。 由于事件处理程序现在是静态的,因此计时器不会保存对弹出窗口实例的引用。 运行探查器,您将看到垃圾回收器现在按预期回收页面实例。


当然,它假设您的页面已从后台堆栈中删除。 通过按后退键或调用NavigationService.GoBack()方法,或使用NavigationService.RemoveBackEntry()手动删除它们(如果您只使用前向导航)