如何正确处理事件,以避免内存泄漏?

时间:2012-01-18 07:54:50

标签: c# .net wpf memory-leaks

我有一个WPF应用程序。那有内存泄漏。我很难找到原因。

尝试使用ANTS探查器,我发现的最好的事情是

我有一个活动public event Action RegistryPropertyChanged

我的代码中有许多其他事件正在注册该事件。

例如

preferences.RegistryPropertyChanged+= new Action (SetupToolTips);

其中一些人正在以这种方式注册

preferences.RegistryPropertyChanged += OnMSChanged;

哪种方式更好,使用,动态还是静态?什么可能导致泄漏的想法?

在我尝试删除 RegistryPropertyChanged 使用的所有行之后,没有泄漏。所有这些事件都出了问题,但我找不到正确的理由。任何想法和帮助表示赞赏。谢谢

2 个答案:

答案 0 :(得分:3)

使用对象时,请确保在处置时将事件解耦 例如:

preferences.RegistryPropertyChanged -= OnMSChanged

另外,我遇​​到一个问题,我有一个通过成员引用托管其他对象的对象。如果您正在使用大量对象,则在完成对象时可能不会删除内存引用。

只是一个示例,但如果您有一个Car对象并且它托管一个Engine对象,请确保在完成Car对象后将Engine对象成员引用设置为NULL。 您需要这样做,因为如果有一个引用回到系统中某个地方主动使用的内容,则这些对象将不会被处置,因为它们是“活动的”。

这都是非常高的水平,但我希望它有所帮助。

答案 1 :(得分:1)

here是关于事件,弱事件等的非常好的帖子。 here是找到记忆漏洞的好起点。

编辑:如果你想要一个qiuck和脏测试。获取您认为未正确收集的组件,并将其添加到您的组件并运行您的应用程序。

 private byte[] myMemoryTest = new byte[300 * 1024 * 1024];    //allocate 300MB

如果你的记忆在你的任务管理器中增长而不是后退,你知道它没有按照你想要的方式收集