【问题标题】:How handle events properly, to avoid having memory leak?如何正确处理事件,避免内存泄漏?
【发布时间】:2012-02-12 23:30:14
【问题描述】:

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

尝试使用ANTS分析器,我发现最好的东西是

我有一个活动public event Action RegistryPropertyChanged

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

举例

preferences.RegistryPropertyChanged+= new Action (SetupToolTips);

而且有些人是这样注册的

preferences.RegistryPropertyChanged += OnMSChanged;

哪种方式更好,使用动态还是静态?有什么想法会导致泄漏吗?

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

【问题讨论】:

  • 您认为什么是“内存泄漏”?该应用程序是否会导致您的系统出现内存问题?
  • 事件处理程序是否被多次附加而不被分离?
  • 说内存泄漏.. 我的意思是,如果我离开应用程序,几个小时后,内存将增长 20 MB。我有一些计时器,它们正在触发这些事件。 @Joey 我猜他们正在连接,没有分离。但是代码真的很大,不知道从哪里拆下来,是不是泄露的原因?

标签: c# .net wpf memory-leaks


【解决方案1】:

使用对象时,请确保事件在 dispose 时解耦。
例如:

preferences.RegistryPropertyChanged -= OnMSChanged

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

只是一个示例,但如果您有一个 Car 对象并且它承载一个 Engine 对象,请确保在完成 Car 对象后将 Engine 对象成员引用设置为 NULL。 您需要这样做,因为即使有一个引用返回到系统中某处正在使用的东西,这些对象也不会被释放,因为它们是“活动的”。

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

【讨论】:

  • 谢谢,我会努力的。
【解决方案2】:

here 是一篇关于事件、弱事件等的非常好的帖子。 here 是查找内存泄漏的一个很好的起点。

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

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

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

【讨论】:

  • 感谢非常有趣的文章。
猜你喜欢
  • 1970-01-01
  • 2013-01-23
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多