0

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 増加します。そして、開いているレポートごとにその量だけ増加し続けます。ご想像のとおり、多くのレポートを開いたり閉じたりすると、最終的にメモリ不足の例外が発生します。

4

0 に答える 0