【问题标题】:UWP compiled binding x:Bind produces memory leaksUWP 编译绑定 x:Bind 产生内存泄漏
【发布时间】:2015-12-11 10:28:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • @O.O 感谢您的回答!我应该更正一下,编译绑定的默认模式是 OneTime,所以在这种情况下我必须指定 OneWay。 link 文档
  • @O.O 关于内存泄漏 我在分析器中看到了以下行为:如果我有动态绑定——在我从页面导航后在每个快照上收集对象。使用已编译的绑定 - 它们不是,但在某些时候 DO 被收集,而其中一些仍然保留。
  • 感谢指正。我在我的应用程序中遇到了同样的问题,但是使用动态绑定并且除了我注意到来回导航加剧了问题之外,无法隔离问题。您可以尝试使用 OnNavigatedTo/From 事件来清除数据上下文和数据绑定以及导航堆栈。如果它适用于您的场景,您还可以启用页面缓存。
  • @O.O 实际上我已经在 Unloaded 事件上添加了 DataContext null 集,但它不会清除已编译的绑定。我个人在 mu 应用程序中使用的东西是在返回时完全清理前向堆栈。我从来没有发现前进很有用,所以我只是擦掉它。
  • @O.O 关于缓存,我有一种情况,用户导航到具有不同参数的相同页面类型。缓存的问题是页面永远不会重新创建,它是同一个实例,这会阻止导航转换、漂亮的后退导航和其他。它只是重写内容。我不知道如何让它缓存实例,而是在导航时创建新实例。

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


【解决方案1】:

由于这个问题,我在 Microsoft Connect 上创建了错误。

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

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

【讨论】:

  • 解决此问题的方法是在页面 Unloaded 事件处理程序中显式调用 Bindings.StopTracking()。这是因为编译的绑定不使用“弱事件”模式,而是直接订阅 INotifyPropertyChanged 的​​ PropertyChanged 事件。这是内存泄漏的原因。要取消订阅事件,您可以调用 Bindings.StopTracking()。编译的绑定代码不会自动调用它。
【解决方案2】:

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

  1. 使用 UnityContainer 之类的 IoC 并制作您的 ViewModel 或 View ContainerControlLifeTime
  2. 移出 UI 后,将 null 分配给 xaml.cs 中的 ViewModel 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2015-06-29
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多