イベントを割り当てられたコントロールのセットを動的に作成するGUIを作成します。実行時にこれらのコントロールを追加して削除する必要があります。それは次のようになります。追加されたイベントハンドルによるメモリリークを防ぐための予防策
FlowLayoutPanel.Controls.Clear();
<< add new controls, assigning Click events with += >>
私が聞いたこと(よりspecificly、メモリはアプリケーションが終了するまで解放されません)メモリリークが発生する可能性があります+ =とイベントハンドラを割り当てます。私はこれを避けたい。私はすべてのイベントハンドラを見つけて削除するためにここにあるHow to remove all event handlers from a controlのようないくつかの関数を書くことができますが、それは非常に複雑に見えます。
別の方法がありますか? Disposeを呼び出すと、これらのイベントハンドラが削除されますか? C/C++のようにメモリを解放するようにオブジェクトを破棄できますか?
ありがとうございます!
PS:問題は、私はどのイベントを切り離すべきかわかりません。たくさんのラベルを作成し、さまざまな種類のonclickイベントをそれらに追加します。フローレイアウトパネルをクリーニングするときに、どのラベルにどのイベントハンドラがアタッチされたかを知る方法がありません。
これはサンプルコードです(_flowLPはFlowLayoutPanelです)。このRefresh()関数は、アプリケーションが終了する前に複数回実行されています。
private void Refresh()
{
Label l;
Random rnd = new Random();
// What code should i add here to prevent memory leaks
_flowLP.Controls.Clear();
l = new Label();
l.Text = "1";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "2";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "3";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "4";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "5";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "6";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
}
編集について:イベントの呼び出しリストに追加されたメソッドを確実に判断できない場合は、イベントハンドラに追加されたデリゲートをコレクションのどこかに残し、そのデリゲートを使用して、来る。または、イベントの呼び出しリストを完全にクリアしていることがわかっている場合は、それらを完全にクリアしてください。 – phoog