【发布时间】: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