取消注册所有事件以释放内存

本文关键字:释放 内存 事件 注册 取消 | 更新日期: 2023-09-27 18:11:56

我有一个允许编辑产品信息的程序。我注意到关闭编辑表单后它没有释放内存。经过一番研究,我偶然发现了这个问题,它提到的问题可能是它挂在事件订阅。

这对我来说是有意义的,因为这个表单上有大约100多个控件,其中许多是自定义的自定义事件,由它们的父控件订阅。这创建了一个相当大的事件订阅层次结构。所以我寻找了一种释放这些的方法,发现这个可以让你取消订阅那个事件。

问题是,我有大量的订阅。我真的需要在表单关闭时逐个手动取消订阅每个事件吗,或者至少有一种方法可以一次性释放它们,或者循环使用它们?

取消注册所有事件以释放内存

请记住:位于+=左侧的对象使包含+=右侧方法的对象保持活动状态。也就是说,引发事件的对象使处理事件的对象保持活动状态,即使处理该事件的对象(例如表单)被处置。

所以你需要确保的是所有的事件引发者都离开了。

然而,如果所有的事件引发程序恰好是控件在同一个Form类订阅这些事件,你将需要手动解除钩所有的事件处理程序时,窗体关闭。

这是因为引发窗体订阅的事件的控件与窗体本身具有相同的生存期。

你只需要担心你订阅的事件是由一个生命周期长于订阅对象的对象引发的。那么订阅对象(表单)需要在它(表单)被处置时取消订阅。

这取决于你的表单和它的事件将存在多长时间。

但是,您可以循环遍历表单中的控件,释放事件。如果你不小心删除了一个不存在的事件——不用担心,它不会抛出异常。

例如,这是如何摆脱所有的文本框。KeyDown-Events:

  private void frm_FormClosed(object sender, FormClosedEventArgs e)
    {
    foreach (Control tb in this.Controls)
    {
        if (tb is TextBox)
        {
            TextBox tb1 = (TextBox)tb;
            tb1.KeyDown -= TextBox_KeyDown;
        }
    }