我应该只使用事件聚合器来防止内存泄漏吗?

Yar*_*veh 2 c# events memory-leaks prism eventaggregator

我们考虑使用Prism事件聚合器来减少由于事件引用而导致的内存泄漏.

  1. 这本身就是使用这种模式的正当理由吗?其他好处现在对我们来说并不感兴趣.我们计划在模型组件之间使用它而不是UI.

  2. 我们的问题是一些开发人员忘记取消注册事件.我看到Prism有一种使用弱引用的味道,但它有局限性.其他风味强制显示Unsubscribe(),这又可以被遗忘.那怎么更好?

Bev*_*van 6

我们的问题是一些开发人员忘记取消注册事件

如果这是您的问题,切换到Prism事件聚合器(或使用任何其他实现)将无法改善.

将一个新的,非平凡的使用模式添加到一个混乱的情况下的新依赖关系根本不会整理它.

需要的是清理你的代码.

我建议使用静态分析工具,如fxCop(aka Code Analysis),GendarmeNDepend,而不是新的代码库.所有这些都能够检测到一些事件没有被解开或IDisposable没有正确实现的情况.

使用静态分析,您可以冷静地识别需要清理的代码.投入使用内存分析器(如dotTrace Memory),您将能够找到最严重的违规者,并及时清理它们.

更新

在回答下面评论中的问题时:

您认为什么是确保事件不被取消的良好模式?

难以确保所有事件都被取消订阅 - 但考虑到实现事件的方式(有关详细信息,请参阅CLR通过C#),您可以通过确保丢弃所有事件订阅来作弊.

代替

public event EventHandler<Fu> FuBar;
Run Code Online (Sandbox Code Playgroud)

自己处理事件订阅,如下所示:

public event EventHandler<Fu> FuBar {
    add { mFuBar += value; }
    remove { mFuBar -= value; }
}

private EventHandler<Fu> mFuBar;
Run Code Online (Sandbox Code Playgroud)

然后,IDisposable在您的类上实现,并在您Dispose()设置的方法mFuBarnull,丢弃订阅.然后,FxCop(以及其他工具)可以告诉您是否未能处理该类.