2009-06-30 52 views
53

如果我有一个只有少数事件处理程序注册的应用程序(并且在应用程序关闭之前使用事件的对象不会被处理),我是否真的需要担心注销那些处理程序?我能看到的唯一好理由是,如果您不需要关心的事件(即您有多个处理程序注册到一个事件),那么可能会有一点额外的开销。还有其他什么好的理由吗?任何人都遇到重大问题,因为他们没有注销事件?不注销事件处理程序不好吗?

回答

68

如果你有A发布事件,并B订阅事件(处理程序),那么它只是一个问题不是是否A想要住了很多长于B退订。基本上,事件订阅意味着A仍然可以看到B,这样可以防止它被垃圾收集,并且即使您忘记了它(也可能是Disposed()),它仍会在其上触发事件。

例如,这是一个问题,如果A是一个静态的事件,您的应用程序运行一段时间B死后......

这要注意的是,有人可能会问如下:

如果B的寿命比A长得多,B会不会将垃圾收集起来?

而且答案是“否”。 B通过该事件没有提及A; A将被正常收集

+0

这是特别糟糕的,如果B是资源沉重... – 2009-06-30 04:34:58

14

许多人似乎认为,如果发布商要超过订阅者,取消订阅活动就非常重要。我不喜欢这种方法。事件订阅者不会从发布者中分离出来,这会对发布者和订阅者以外的实体的行为产生一些令人讨厌的依赖关系。如果对发布者的引用持续时间超过预期,那么这将保持用户活着,以及用户持有引用的任何对象。如果大量被抛弃的对象被事件处理程序相互关联,但其中没有任何实时引用存在,则所有对象都可以被垃圾收集器清理。但是,如果有人意外地保留了其中一个对象的引用,那么可能会阻止任何对象被垃圾收集。

恕我直言,主动删除事件处理程序比放弃它们更好,希望一切都被清理干净。除非可以肯定的是,没有意外的引用发布者可以存在,这种方法可能“主要”工作,但偶尔会造成内存泄漏。