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