处理表单时管理EventAggregate的最佳做法

时间:2015-12-13 01:09:54

标签: c# winforms eventaggregator

一个概念性的问题:

我实现了一个大量使用多线程(等待/异步)的Winform程序,它基于一个MDI表单,它有一个对接控件和可以打开/关闭的窗口。其中一些只是隐藏在近处,而另一些则被处理

我开始创建我的业务类暴露vanilla事件,但很快我意识到我会因为内存泄漏而做恶梦(记得在关闭表单时删除每个订阅事件到其他组件等等)并且我实现了使用自定义事件聚合器

的更好解决方案

这样的事件聚合器使用WeakReference,所以我认为我不必记得清理每个聚合事件订阅者,问题是当我关闭我的表单(并且它们被处置)时,WeakReference仍然显示那些表单Alive,那是因为Forms还没有GarbageCollected,这会导致订阅者仍然可以接收已发布事件的问题。

现在我想知道处理这类问题的最佳方法是什么,目前我的选择是:

  1. 当我在EventAggregate中通知一个事件时,我可以检查接收器是否是IDisposable并检查它是否是System.Windows.Forms.Control,然后检查它的“IsDisposed”/“IsDisposing”属性

  2. 在每个事件处理程序中检查表单是否处置/处置,以防止在已处置的对象上做东西

  3. 覆盖每个表单上的OnDispose并强制GC.Collect,以便我的弱引用表示订阅者已死亡

  4. 覆盖每个表单上的OnDispose并取消注册表单已完成的任何订阅

  5. 1和2是丑陋的,3和4是更好但我希望我想念一些其他方式以更好的方式完成这个,任何建议?

1 个答案:

答案 0 :(得分:0)

首选方式(恕我直言)将是#4的变体,而不是使用x_vec使用OnFormClosed()它是更可靠的,以防你的来电者关闭论坛但从未处理它。

OnDispose()