0

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 に設定しましたが、メモリリークは残ります。

4

1 に答える 1

0

If you create any event handlers to the controls, these also need to be released. .Net's GC will scan it's object to look for a link to the object. Calling dispose will stop you from being able to reference the object but if there is an event handler still attached, the GC thinks that the event could still be raised.

In VB.Net you can do

RemoveHandler frmChart.Load, AddressOf ControlLoad

This will then allow the GC to remove the object from memory.

于 2013-02-07T14:55:03.957 に答える