一个概念性的问题:
我实现了一个大量使用多线程(等待/异步)的Winform程序,它基于一个MDI表单,它有一个对接控件和可以打开/关闭的窗口。其中一些只是隐藏在近处,而另一些则被处理
我开始创建我的业务类暴露vanilla事件,但很快我意识到我会因为内存泄漏而做恶梦(记得在关闭表单时删除每个订阅事件到其他组件等等)并且我实现了使用自定义事件聚合器
的更好解决方案这样的事件聚合器使用WeakReference,所以我认为我不必记得清理每个聚合事件订阅者,问题是当我关闭我的表单(并且它们被处置)时,WeakReference仍然显示那些表单Alive,那是因为Forms还没有GarbageCollected,这会导致订阅者仍然可以接收已发布事件的问题。
现在我想知道处理这类问题的最佳方法是什么,目前我的选择是:
当我在EventAggregate中通知一个事件时,我可以检查接收器是否是IDisposable并检查它是否是System.Windows.Forms.Control,然后检查它的“IsDisposed”/“IsDisposing”属性
在每个事件处理程序中检查表单是否处置/处置,以防止在已处置的对象上做东西
覆盖每个表单上的OnDispose并强制GC.Collect,以便我的弱引用表示订阅者已死亡
覆盖每个表单上的OnDispose并取消注册表单已完成的任何订阅
1和2是丑陋的,3和4是更好但我希望我想念一些其他方式以更好的方式完成这个,任何建议?
答案 0 :(得分:0)
首选方式(恕我直言)将是#4的变体,而不是使用x_vec
使用OnFormClosed()
它是更可靠的,以防你的来电者关闭论坛但从未处理它。
OnDispose()