明らかな何かが欠けている場合は申し訳ありませんが、FlowLayoutPanel - (panelName).Controls.Clear(); からコントロール (一連のユーザー コントロール) をクリアしようとしています。残念ながら、これはパネル上のオブジェクトのデストラクタを呼び出しているようには見えません。タスク マネージャーの [ユーザー オブジェクト] 列は、10,000 に達して例外がスローされるまで、どんどん増え続けます。
ここで何が欠けているか知っている人はいますか?
明らかな何かが欠けている場合は申し訳ありませんが、FlowLayoutPanel - (panelName).Controls.Clear(); からコントロール (一連のユーザー コントロール) をクリアしようとしています。残念ながら、これはパネル上のオブジェクトのデストラクタを呼び出しているようには見えません。タスク マネージャーの [ユーザー オブジェクト] 列は、10,000 に達して例外がスローされるまで、どんどん増え続けます。
ここで何が欠けているか知っている人はいますか?
解決策ではありませんが、回避策です。オブジェクトは、この (大まかな、メモリからの) コードによって破棄されているようです。
while(FlowLayoutPanel.Controls.Count > 0)
FlowLayoutPanel.Controls.Remove(0);
上記のeftpotrmの回避策では、ユーザーハンドル数が増え続けましたが、コントロールを削除した後に手動で破棄すると、100%修正されました.
while (myFlowLayoutPanel.Controls.Count > 0)
{
var controltoremove = myFlowLayoutPanel.Controls[0];
myFlowLayoutPanel.Controls.Remove(controltoremove);
controltoremove.Dispose();
}
.NET にはデストラクタの概念がありません。.NET には、C# のデストラクタに構文的に似た「ファイナライザ」と呼ばれるものがあります。詳細については、CLR のしくみに関する Jeff Richter の素晴らしい本 ( CLR via C# ) を参照してください。
オブジェクトに IDisposable パターンを実装し、使い終わったら Dispose() メソッドを呼び出すことができます。
メモリ プロファイラー(例: ants )を使用してみてください。これにより、何がコントロールを維持しているのかがわかります。この種の問題を推測するのは非常に困難です。
Red-gate は 14 日間のテールを提供します。これは、この問題を解決し、メモリ プロファイラーが長期的な価値を提供するかどうかを判断するのに十分な時間です。
市場には他にも多くのメモリ プロファイラーが存在します ( .NET メモリ プロファイラーなど)。そのほとんどに無料試用版がありますが、Red-Gateツールは使いやすいので、最初に試してみてください。