2015-02-08 65 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