Vb.net 持久Winform用户控件和内存不足异常

Vb.net 持久Winform用户控件和内存不足异常,vb.net,winforms,memory,memory-leaks,resources,Vb.net,Winforms,Memory,Memory Leaks,Resources,我有一个Winform应用程序,正在与WCF和SQL一起使用。用户用于创建报表的程序的一部分将动态创建自定义用户控件,并将对它们的引用放入我维护的哈希表中。然后,当用户通过选择树视图上的节点浏览报告时,我将用户控件加载并卸载到面板中 下面是我用来创建它们并将它们放入集合的代码 ucIncidentInstance = New ucIncidentMR(IncidentReport, IncidentReportGUID) ucIncidentInstance.Tag = "Inc

我有一个Winform应用程序,正在与WCF和SQL一起使用。用户用于创建报表的程序的一部分将动态创建自定义用户控件,并将对它们的引用放入我维护的哈希表中。然后,当用户通过选择树视图上的节点浏览报告时,我将用户控件加载并卸载到面板中

下面是我用来创建它们并将它们放入集合的代码

    ucIncidentInstance = New ucIncidentMR(IncidentReport, IncidentReportGUID)
    ucIncidentInstance.Tag = "IncidentMR"
    ucIncidentInstance.Dock = DockStyle.Fill
    Globals.ControlTable.Add(IncidentReportGUID, ucIncidentInstance)
    Globals.GlobalNode.Nodes.Add(IncidentReportGUID, "Incident Report")
下面是当用户在treeview中导航时将它们移入和移出表单面板的代码

    If Globals.ControlTable.ContainsKey(e.Node.Name) Then
        panelMain.Controls.Clear()
        panelMain.Controls.Add(CType(Globals.ControlTable(e.Node.Name), UserControl))
    Else
        If e.Node.Name = "MainNode" Then
            panelMain.Controls.Clear()
        End If
    End If
下面是我在forms Closing事件中使用的代码,当用户关闭这个案例时,我尝试清理内存。我在有没有.Dispose()行和=Nothing行的情况下都做过。这段代码确实得到执行,但似乎没有帮助

    For Each item In Globals.ControlTable
        item.Value.Dispose()
    Next

    Globals.ControlTable.Clear()

当我进入内存分析器时,即使创建控件的窗体已从内存中卸载,控件仍保留在内存中。探查器报告上面列出的控件拥有8818k的内存。当一个报告关闭而另一个报告打开时,此控件的保留内存将增加8818k。而且每次打开的报告都会继续增加这个数量。正如您所想象的,打开和关闭大量报表的人最终会出现内存不足异常。

乍一看,您只是在使用myControl:myControl.Dispose()而不是创建它的对象。你不能只调用Globals.ControlTable(item.Key).Dispose()?我尝试了那个方法,但行为没有改变。可能是重复的