2015-09-15 31 views
19

在開發UWP應用程序時,我最近發現了不少內存泄漏,阻止了我的頁面被GC收集。 我有一個ContentPresenter我的網頁像:UWP編譯綁定x:綁定產生內存泄漏

<ContentControl Grid.Column="0" Grid.Row="1" Content="{x:Bind ViewModel.Schedule, Mode=OneWay}"> 
</ContentControl> 

之後,我刪除內容或動態{結合}取代它 - 當我從它導航頁面被收集。否則它仍然在內存中。 它是錯誤還是我做錯了什麼?有沒有辦法釋放和清除所有綁定從導航?

UPDATE: 這似乎是微軟內部的一個已知的問題,指出here。 但是,就我所見,通過我自己的測試/應用程序使用情況,由x:Bind保留的數據仍會在一段時間後收集,例如,當您導航到相同的頁面或爲某些創建相同的控件時時間。我可以看到創建了新的對象,但在某個時間點收集了舊對象。

因此,對我來說,它似乎不是一個引起內存不足的嚴重問題,它只是不允許對象像動態綁定一樣快速收集。

+0

@ O.O謝謝你的回答!我只應該糾正,對於編譯綁定默認模式是OneTime,所以我必須在這種情況下指定OneWay。 [鏈接](https://msdn.microsoft.com/en-us/library/windows/apps/mt204783.aspx)到文檔 – Viachslau

+0

@OO關於內存泄漏我在profiler中看到了以下行爲:如果我有動態綁定 - 在我從頁面導航後,每個快照上都會收集對象。使用編譯綁定 - 他們不是,但是在某個時刻DO收集,而其中一些仍然保留。 – Viachslau

+0

感謝您的糾正。我在我的應用程序中遇到了同樣的問題,但是使用動態綁定並且無法隔離問題,除非我注意到來回導航會加劇此問題。您可以嘗試使用OnNavigatedTo/From事件清除datacontext和數據綁定和導航堆棧。如果它在您的方案中起作用,您也可以啓用頁面緩存。 –

回答

1

是它會造成內存泄漏,防止你可以使用以下步驟:

  1. 使用的IoC像UnityContainer,使您的視圖模型或視圖ContainerControlLifeTime
  2. 在xaml.cs指定空到視圖模型屬性一次你移出UI。
3

由於此問題,我在Microsoft連接上創建了一個錯誤。

https://connect.microsoft.com/VisualStudio/feedback/details/3077894/memory-leaks-in-c-uwp-apps-using-compiled-x-bind-bindings

解決有關此問題的是()在卸載的頁面事件處理程序明確調用Bindings.StopTracking。這是因爲編譯綁定不使用「弱事件」模式,並且直接訂閱了INotifyPropertyChanged的PropertyChanged事件。這是內存泄漏的原因。要取消訂閱活動,您可以調用Bindings.StopTracking()。編譯的綁定代碼不會自動調用它。

+0

解決此問題的方法是在頁面Unloaded事件處理程序中顯式調用Bindings.StopTracking()。這是因爲編譯綁定不使用「弱事件」模式,並且直接訂閱了INotifyPropertyChanged的PropertyChanged事件。這是內存泄漏的原因。要取消訂閱活動,您可以調用Bindings.StopTracking()。編譯的綁定代碼不會自動調用它。 –