删除页面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()
手动删除它们(如果您只使用前向导航)
上述就是C#学习教程:删除页面Windows手机分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1020356.html