UWP编译绑定x:Bind产生内存泄漏

时间:2015-09-15 08:36:44

标签: c# xaml windows-runtime winrt-xaml uwp

在开发UWP应用程序时,我最近发现了很多内存泄漏,导致我的页面被GC收集。 我的页面上有一个ContentPresenter,如:

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

删除内容后,或用动态{Binding}替换它 - 当我从中导航时收集页面。否则它会留在内存中。 是错误还是我做错了什么?有没有办法在导航时释放并清除所有绑定?

更新 它似乎是微软内部已知的问题here。 但是,就我自己的测试/应用程序使用情况而言,x:Bind保留的数据仍会在一段时间后收集,例如,当您导航到相同的页面或创建相同的控件一段时间。我可以看到创建了新对象,但在某些时候收集了旧对象。

所以对我而言,它似乎并不是导致内存不足的严重问题,它只是不允许像动态绑定一样快速收集对象。

2 个答案:

答案 0 :(得分:4)

由于此问题,我在Microsoft connect上创建了错误。

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

解决此问题的方法是在页面卸载事件处理程序中显式调用Bindings.StopTracking()。这是因为编译的绑定不会使用&#34;弱事件&#34;模式并直接订阅INotifyPropertyChanged的PropertyChanged事件。这是内存泄漏的原因。要取消订阅事件,您可以调用Bindings.StopTracking()。编译的绑定代码不会自动调用它。

答案 1 :(得分:2)

是的确导致内存泄漏,以防止您可以使用以下步骤:

  1. 使用像UnityContainer这样的IoC并制作ViewModel或View ContainerControlLifeTime
  2. 移出UI后,在xaml.cs为ViewModel属性指定null。