4

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

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

有区别吗

this.Close()

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

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

4

2 回答 2

5

如果有的话,这些事件是托管资源(我不确定您是否可以调用事件资源)。

是的,您应该从子窗口(不是主窗口,因为它无关紧要)取消事件处理程序,否则您可能会遇到内存泄漏,因为垃圾收集器将无法拾取那些仍然有引用的对象。

查看此博客以获取有关内存泄漏和事件处理程序的更多信息:

所有 .NET 应用程序共有的经典泄漏,以及开发人员的常见疏忽。如果您创建一个事件处理程序来处理发生在其他对象中的事件,那么如果您在完成后不清除链接,则会留下不需要的强引用。

于 2013-11-03T09:25:20.120 回答
5

如果您是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. 因此,窗口对象将在 EventAggregator 对象的生命周期内持续存在。

于 2013-11-03T09:26:09.197 回答