0

在与今天似乎对 .NET 非常了解的老板交谈时,他说我应该养成在设计器中删除事件分配给控件的习惯。

我不记得他的确切解释,但我记得事件没有包含在同一个线程中,实际上它并没有完全被垃圾收集清理干净?这是通过电话讨论,我的耳机很烂,听不清楚他说了什么

我只是希望有人可以详细说明,或者指出我进一步阅读它的方向?

谢谢!

值得一提的是,我们使用的是 .NET 3.5

4

1 回答 1

3

有一个简单的规则。仅当事件源对象超过事件订阅者对象时,才需要显式取消订阅事件。

在 Winforms 应用程序中几乎不会出现这种情况,因为表单对象及其包含的组件和控件同时死亡。表单通过 Controls 集合引用了控件。控件可以通过其事件的委托对象来引用表单,这可以使表单对象保持活动状态。你老板的担心。然而,垃圾收集器对像这样的循环引用没有问题,它在收集表单对象的同时收集控件和事件委托对象。

在某些特定情况下,事件源对象确实比订阅者对象更长寿。Application.Idle 事件和 SystemEvents 事件的情况。这些事件值得注意的是它们是静态的,因此在程序的生命周期内保持其订阅对象引用,GC 无能为力。当关闭表单不会终止应用程序时,需要明确取消订阅这些事件。

如果您对自己的代码有任何疑问,请使用内存分析器来验证您的假设。

于 2013-10-07T20:34:53.340 回答