2015-02-08 78 views
2

我有一个大项目,我的应用程序一直保留着我导航的页面。该页面只使用最少的,并有很多图形,因此我希望它完全从内存中删除。删除页面windows手机

因此,我用下面的

NavigationService.RemoveBackEntry(); 

使用我看到的是,上面的代码中确信,我只会在页面的1个实例剖析。但是,由于图形很重,我仍然希望将它从内存中完全删除,即分析器中没有实例。

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

为了排除任何愚蠢的错误,我做了this small sample。只使用内存弹出检查器在两个哑页之间导航。但仍然存在1-2个页面实例。有没有办法强制删除页面,以免它们存储在内存中?

我说:

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

到OnNavigated到,并删除除了第一页我开始上的所有网页。我已经使用了调试分析工具箱,并且可以看到,无论我从哪开始的第一页都不会被删除,当我离开它时。

+0

也许看看http://www.jayway.com/2012/05/25/清空窗口8页缓存/ – JTIM 2015-02-08 12:55:58

+0

似乎并不工作 – JonasN89 2015-02-08 13:28:47

+0

想知道如果您已尝试将该页面的“NavigationCacheMode”设置为“Disabled”? – 2015-02-18 00:21:45

回答

2

WP Silverlight运行时将在内存中保留最多三页,即使在从后台堆栈中移除后。这种行为的原因目前还不清楚,但我发现了一个(丑陋的)解决方法:http://blogs.codes-sources.com/kookiz/archive/2013/11/11/wpdev-give-that-memory-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属性保留对该页面的引用。所以,只要你的计时器滴答作响,你只是让你的页面不朽。 为了证明问题出在那里,只需要使UpdateMemoryInfo方法静态(并且删除里面的所有UI更新代码)。由于事件处理程序现在是静态的,所以定时器不会持有对popup实例的引用。运行分析器,你会发现现在页面的实例现在已经被垃圾回收器回收了。


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

+0

当我们尝试实施它时,似乎不起作用。即使在问题中包含的虚拟应用程序。 通过您的博客文章,您似乎只能导航,并使用backkey返回。但在这个应用程序中,不一定使用backkey。更有可能的是,不同页面之间的导航服务。 您是否仅使用NavigationService而不是backkey来试用它。我们实现中的backkey用作退出。 – JTIM 2015-02-10 20:25:50

+0

我有和JTIM – JonasN89 2015-02-11 17:01:53

+0

@ JonasN89一样的意见对不起,刚才注意到你的repro项目还有另外一个问题。看我的编辑。 – 2015-02-12 20:53:02