【问题标题】:Disposing WPF User Control & Memory Management处理 WPF 用户控制和内存管理
【发布时间】:2013-01-24 08:28:46
【问题描述】:

我在 WPF 中创建了一个继承自 wpf 数据网格控件的自定义数据网格控件。

因此,当用户查询数据库时,会返回数百条记录,每条记录有 15 到 20 列。

我相信当我控制屏幕时,分配给该屏幕及其网格的所有内存都应该由 GC 回收。但事实并非如此。

我在 Red Gate 的 Memory Profiler 中测试我的应用程序,当我打开屏幕时它显示分配给它的 30 mb 内存。

但是当我关闭此屏幕时,应用程序仍以某种方式保留该内存,当我在 ants 内存分析器中查看原因时,它显示由于我的自定义数据网格,我的屏幕实例仍在内存中。

我已将卸载事件添加到我的用户控件并分离我在此过程中附加的所有事件处理程序。

我错过了什么,我该怎么办?

【问题讨论】:

    标签: wpf datagrid memory-leaks idisposable red-gate-ants


    【解决方案1】:

    您不应该释放 UserControl,并且您可能不应该构建 IDisposable UserControl。那是设计的味道。内存分析器可以告诉您为什么应用程序仍然保留该内存,然后您必须修复该错误。

    更新:

    要找出谁在 ANTS 中实际持有该内存,您可以使用 Instance Retention Graph 功能。在 .NET Memory Profiler(我更喜欢 ANTS)中,它被称为 Root Path

    【讨论】:

    • 是的,但我只是想问我应该怎么做才能确保在卸载我的用户控件时释放它所持有的所有内存
    • 你不能。如果不再需要,它将自动释放。在您的情况下,它 is 在某处仍然需要(即引用)。您只能通过修复那里的错误来做到这一点。您需要找出谁在保留该记忆,并尝试找到一种不会发生这种情况的方法。
    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 2013-11-19
    • 2011-03-05
    • 1970-01-01
    • 2015-10-04
    • 2013-07-26
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多