处理WPF用户控制和内存管理

处理WPF用户控制和内存管理,wpf,datagrid,memory-leaks,idisposable,red-gate-ants,Wpf,Datagrid,Memory Leaks,Idisposable,Red Gate Ants,我创建了一个自定义数据网格控件,该控件继承自wpf中的wpf数据网格控件 因此,当用户查询数据库时,数百条记录返回,每条记录有15到20列 我相信,当我控制屏幕时,分配给这个屏幕及其网格的所有内存都应该由GC回收。但事实并非如此 我在RedGate的内存分析器中测试我的应用程序,当我打开分配给它的30 mb内存的屏幕时,它会显示出来 但当我关闭这个屏幕时,应用程序仍然以某种方式保留着那个内存,当我在ants memory profiler中查找原因时,它显示我的屏幕实例仍然在内存中,因为我的自定

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

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

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

我在RedGate的内存分析器中测试我的应用程序,当我打开分配给它的30 mb内存的屏幕时,它会显示出来

但当我关闭这个屏幕时,应用程序仍然以某种方式保留着那个内存,当我在ants memory profiler中查找原因时,它显示我的屏幕实例仍然在内存中,因为我的自定义数据网格

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


我错过了什么?我应该怎么做?

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

更新:


要找出蚂蚁的记忆到底是谁,可以使用该功能。在.NET内存探查器中,我更喜欢它,而不是ANTS。是的,但我只是想问一下,在卸载用户控件时,我应该做些什么来确保释放它所保留的所有内存。您不能。如果不再需要,它将自动释放。在您的情况下,它仍然是需要的,即在某处引用。你只能通过修复你那里的bug来做到这一点。你需要找出是谁保留了这段记忆,并试图找到一种避免这种情况发生的方法。