我有一个允许编辑产品信息的程序。我注意到在关闭编辑表单后它没有释放内存。经过一番研究,我偶然发现了this问题,该问题提到问题可能在于它与事件订阅有关。
这对我来说很有意义,因为此表单上有大约100多个控件,其中许多控件是使用其父控件订阅的自定义事件进行自定义的。这将创建相当大的事件订阅层次结构。因此,我寻找了一种释放这些事件的方法,并发现了this,您可以从该事件中退订。
问题是,我有大量的订阅。我是否真的必须在表单关闭时手动逐个退订每个事件,或者至少有一种方法可以一举释放它们,或者循环遍历它们?
最佳答案
请记住以下几点:+=
的LEFT上的对象使包含+=
的RIGHT上的方法的对象保持事件状态。即,引发事件的对象即使处理事件的对象(例如表单)被放置,也使处理事件的对象保持事件状态。
因此,您需要确保的是所有事件筹办者都已离开。
但是,如果所有事件引发者恰好是订阅这些事件的同一个Form
类中的控件,则在关闭表单时,您将不需要手动取消钩挂所有事件处理程序。
这是因为引发表单要订阅的事件的控件与表单本身具有相同的生存期。
您只需要担心如果订阅的对象的生命周期比订阅对象的生命周期长,就可以担心。然后,在处理对象(表单)时,将需要取消订阅该对象(表单)。
关于c# - 注销所有事件以释放内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16362027/