1 つのフォーム (frmDash) で複数のフォームをコンテナー内のコントロールとして追加するプロジェクトを作成しました。
frmChart.TopLevel = False
frmChart.FormBorderStyle = False
frmChart.ControlBox = False
container.Controls.Add(frmChart)
frmDash を閉じると、メモリは減少しますが、期待したほどではありません。
そのため、frmDash を再度開くたびに、前回開いたときと比較してメモリが増加します。
frmDash を閉じると:
For each frm as frmChart in container.Controls
frm.Close
Next
container.Controls.Clear
container.Dispose
そして frmChart dispose メソッドでは、私が持っているすべてのものを処分します (データテーブル、リスト、チャート - それらのいくつかを処分してはならないことはわかっていますが、何が間違っているのかを見つけようとしています)。
誰かが私が間違っていることを知っていますか?
私はこれを見つけました:
DataSet.Clear() と DataSet.Dispose() は、GC によって行がクリアされないことにも言及したいと思います。.Clear() メソッドは、データセット内のすべてのデータ テーブルのすべてのデータ行を削除します。ただし、テーブルとリレーションシップは削除されません。また、.Dispose() メソッドは、DataSet MarshalByValueComonent の基本クラスによって実装されるため、データセットのマネージド リソースを解放しません。
GC がすべてのデータテーブルとデータ行をクリアできるようにするには、ds を null に設定して、元のデータセットのすべての管理対象リソースが参照されないようにし、GC が最終的にそれらをすべてクリアできるようにします。もう 1 つの方法は DataSet.Reset を使用しているため、データセットはテーブルやリレーションシップが追加されていない初期化された状態になります。
それが本当なら、すべてのデータテーブルを空に設定する必要があります。なぜなら、それを処分しているだけだからです。
私はそれを行い、使用したすべてのデータテーブルを Nothing に設定しましたが、メモリリークは残ります。