在关闭wpf中的窗口时,我是否必须取消订阅事件?

时间:2013-11-03 09:22:19

标签: c# wpf

倾斜者在我的窗口(不是主窗口)构造函数中说明了这一切

EventAggregator.OnUserLoggedIn += OnUserLoggedIn;
EventAggregator.OnUserLoggedOff += OnUserLoggedOff;

之间有区别吗?
this.Close()

EventAggregator.OnUserLoggedIn -= OnUserLoggedIn;
EventAggregator.OnUserLoggedOff -= OnUserLoggedOff;
this.Close()

我已经读到关闭窗口会处理所有未管理的资源,这些事件被认为是管理不受管理还是未受管理的事件?

2 个答案:

答案 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对象的生命周期。