【发布时间】:2015-12-13 09:17:16
【问题描述】:
给你一个概念性问题:
我已经实现了一个 Winform 程序,它大量使用多线程(等待/异步),并且基于一个 MDI 表单,该表单具有一个停靠控件和许多可以打开/关闭的窗口。其中一些只是在关闭时隐藏,而另一些则被丢弃
我开始创建暴露普通事件的业务类,但很快我意识到由于内存泄漏我会做噩梦(记得在关闭表单时将每个订阅的事件删除到其他组件,等等......)并且我实现了一个使用自定义事件聚合器的更好解决方案
这样的事件聚合器使用 WeakReference,所以我认为我不必记得清理每个聚合事件订阅者,问题是当我关闭我的表单(并且它们被处理)时,WeakReference 仍然显示那些表单are Alive,这是因为 Forms 还没有被 GarbageCollected,这导致订阅者仍然可以接收已发布的事件。
现在我想知道处理此类问题的最佳方法是什么,目前我的选择是:
当我在 EventAggregate 中通知一个事件时,我可以检查接收器是否为 IDisposable 并检查它是否为 System.Windows.Forms.Control,然后检查其“IsDisposed”/“IsDisposing”属性
在每个事件处理程序中检查表单是否被释放/释放,以防止在释放的对象上做任何事情
在每个 Form 上覆盖 OnDispose 并强制 GC.Collect,以便我的弱引用向订阅者发出已死的信号
在每个表单上覆盖 OnDispose 并取消注册我的表单已完成的任何订阅
1 和 2 很丑,3 和 4 更好,但我希望我能错过一些其他方式来以更好的方式实现这一点,有什么建议吗?
【问题讨论】:
标签: c# winforms eventaggregator