倾斜者在我的窗口(不是主窗口)构造函数中说明了这一切
EventAggregator.OnUserLoggedIn += OnUserLoggedIn;
EventAggregator.OnUserLoggedOff += OnUserLoggedOff;
之间有区别吗?
this.Close()
和
EventAggregator.OnUserLoggedIn -= OnUserLoggedIn;
EventAggregator.OnUserLoggedOff -= OnUserLoggedOff;
this.Close()
我已经读到关闭窗口会处理所有未管理的资源,这些事件被认为是管理不受管理还是未受管理的事件?
答案 0 :(得分:5)
这些事件是托管资源(如果有的话)(我不确定你是否可以调用事件资源)。
是的,你应该从子窗口取消事件处理程序(不是主窗口,因为它没关系)否则你可能会遇到内存泄漏,因为垃圾收集器将无法接收那些仍然有引用的对象。
检查this blog以获取有关内存泄漏和事件处理程序的更多信息:
所有.NET应用程序常见的经典泄漏,以及开发人员的共同监督。如果您创建一个事件处理程序来处理某些其他对象中发生的事件,那么,如果您在完成后没有清除该链接,则会留下不需要的强引用。
答案 1 :(得分:4)
如果您是closing the main window
,您的申请将在don't have to worry about unhooking the handler
之后终止。一旦进程终止,与进程关联的所有内存都可用于回收。
但是如果你在talking about secondary window
并且你的进程将继续运行,你应该consider unhooking the events
,因为只要EventAggregator停留在内存中并且导致内存泄漏,窗口将始终在内存中窗口类。
Publisher (EventAggregator) will hold on to the subscriber object (window) as long as it stays in memory
。因此,window对象将持续使用EventAggregator对象的生命周期。