我有一个与 WCF 和 SQL 一起使用的 Winform 应用程序。用户用于创建报告的程序的一部分将动态创建自定义用户控件并将对它们的引用放入我维护的哈希表中。然后,当用户通过选择树视图上的节点来浏览报告时,我将用户控件加载和卸载到面板中。
这是我用来创建它们并将它们放入集合中的代码
ucIncidentInstance = New ucIncidentMR(IncidentReport, IncidentReportGUID)
ucIncidentInstance.Tag = "IncidentMR"
ucIncidentInstance.Dock = DockStyle.Fill
Globals.ControlTable.Add(IncidentReportGUID, ucIncidentInstance)
Globals.GlobalNode.Nodes.Add(IncidentReportGUID, "Incident Report")
这是在用户浏览树视图时将它们移入和移出表单上的面板的代码
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
这是我在表单关闭事件中使用的代码,用于在用户关闭此案例时尝试清理内存。我已经完成了有和没有 .Dispose() 行和 = Nothing 行的情况。这段代码确实被执行了,但似乎没有帮助。
For Each item In Globals.ControlTable
item.Value.Dispose()
Next
Globals.ControlTable.Clear()
当我进入内存分析器时,即使创建它们的表单已从内存中卸载,控件仍保留在内存中。分析器报告上面列出的控件拥有 8818k 的内存。当一个报表关闭并打开另一个报表时,此控件的保留内存将增加 8818k。并且对于打开的每个报告继续增加该数量。可以想象,打开和关闭大量报表的人最终会遇到内存不足异常。