从对象中删除事件引用以使垃圾回收正常工作

时间:2018-12-17 20:23:09

标签: c# winforms memory-leaks garbage-collection

我们遇到了一个问题,我们的应用程序不断消耗RAM,因此我在其上拍了一些诊断工具,并查看了进程内存的三个不同快照,并注意到每次我们搜索用户时,都会创建对象(表单) ,不会放在Close()表单上。

这是搜索用户时发生的代码。

private void btnSearch_Click(object sender, EventArgs e)
{
    frmCombinedSearch frmCmbSearch = new frmCombinedSearch();
    try
    {
        // Shows the 'form' in the same tab. This is a tabbed control.
        frmCmbSearch.ShowInTab(this.ParentTabPage);
    }
    catch (Exception ex)
    {
        this.ShowException(ex);
    }
}

一旦显示frmCombinedSearch,该对象将一直存在,直到按下另一个按钮,最终触发表单上的this.Close()事件。据我了解,此后该对象已被GC标记为已释放。

调查了在Diagnostic Tools会话中创建的对象之后,我注意到该对象中有Event Handlers个不是取消订阅的对象。

下面是“诊断”工具中的代码段,其中显示了在个人搜索之后创建的其他对象。

Summary

Events

如何手动取消订阅事件,以便GC释放资源?

0 个答案:

没有答案