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
そして、ユーザーがこのケースを閉じたときにメモリをクリーンアップしようとするために、フォームの Closing イベントで使用するコードを次に示します。.Dispose() 行と = Nothing 行がある場合とない場合があります。このコードは実行されますが、役に立たないようです。
For Each item In Globals.ControlTable
item.Value.Dispose()
Next
Globals.ControlTable.Clear()
メモリ プロファイラにアクセスすると、コントロールを作成したフォームがメモリからアンロードされているにもかかわらず、コントロールがメモリに残ります。プロファイラーは、上記のコントロールが 8818k のメモリを保持していることを報告します。レポートを閉じて別のレポートを開くと、このコントロールの保持メモリは 8818k 増加します。そして、開いているレポートごとにその量だけ増加し続けます。ご想像のとおり、多くのレポートを開いたり閉じたりすると、最終的にメモリ不足の例外が発生します。