私の C# プロジェクトには、いくつかのテキスト ボックスを追跡する静的クラスがあります。メモリ リークを防ぐために、テキスト ボックスをリストから削除する必要があります。
リストにテキスト ボックスを追加する静的関数があります。
public static void Add(TextBox tb)
{
tb.HandleCreated += new EventHandler(TextBoxHandleCreated);
}
static void TextBoxHandleCreated(object sender, EventArgs e)
{
TextBox tb = sender as TextBox;
tb.HandleDestroyed += new EventHandler(OnHandleDestroyed);
tbList.Add(tb);
}
static void OnHandleDestroyed(object sender, EventArgs e)
{
// Remove it
Remove(sender as Control);
}
UserControl
myの a のコンストラクターから add 関数を呼び出しますForm
。remove 関数で呼び出すc.HandleDestroyed -= OnHandleDestroyed;
ので、その理由でコントロールを維持しません。
このRemove
関数は、チェックして削除する単純なループです。
public static void Remove(Control c)
{
foreach (Control cl in cList)
{
if (c.Equals(cl))
{
c.HandleDestroyed -= OnHandleDestroyed;
cList.Remove(cl);
//break;
}
}
}
問題は、ダイアログが表示されてから破棄されたときに、作成されたものと破棄されたものが一致することを期待していることですが、そうではありません。破壊するよりも作成する方が少し多いです。
どうしてこんなことに?