コンテナと呼ばれるユーザーコントロールがあり、実行時に他のユーザーコントロールを追加しています。
コンテナからすべてのコントロールを削除したいのですcontainer.Controls.Clear()
が、コントロールはまだメモリに残っています。どうすればそれらをnullにすることができますか?
コンテナと呼ばれるユーザーコントロールがあり、実行時に他のユーザーコントロールを追加しています。
コンテナからすべてのコントロールを削除したいのですcontainer.Controls.Clear()
が、コントロールはまだメモリに残っています。どうすればそれらをnullにすることができますか?
Clearメソッドを呼び出しても、メモリからコントロールハンドルは削除されません。メモリリークを回避するには、Disposeメソッドを明示的に呼び出す必要があります。
続きを読む:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.clear.aspx
パネルがすべての子コントロールを含む親コントロールであると仮定します。したがって、すべての子コントロールをループし、それぞれのdisposeメソッドを呼び出します...これで問題が解決する可能性があります
while (panel.Controls.Count > 0)
{
panel.Controls[0].Dispose();
}
clearメソッドを呼び出すと、メモリからではなくコンテナコントロールからコントロールを削除するだけなので、それらを破棄する必要があります...
親コンテナを呼び出すDispose()
と、子コントロールもすべて実装されていると想定して、すべての子コントロールが破棄されIDisposable
ます。一般的に、すべてのWinFormsコントロールはIDisposableを実装するため、これは機能するはずです。
そうでない場合(WPFコントロールは暗黙的にアンマネージコードを使用しないため、WPFの場合のように)、コントロールにカスタムクリーンアップメソッドを追加する必要があります。メモリリークの最も一般的な原因の1つは、切り離されていないイベントハンドラです。私は通常、次のようなことをします。
public void CleanUp()
{
//detach event handlers
//other cleanup as necessary
}
これは、これを仮想化し、ユーザーコントロールが継承する基本クラスに追加する場合に特に役立ちます。したがってCleanUp()
、タイプを確認せずに簡単に呼び出すことができます。IDisposableは主に管理されていないリソースをクリーンアップするためのものであるため、私はIDisposableを実装するよりもこの方法が個人的に好きです。