Я собираюсь сделать графический интерфейс, который будет иметь динамически создаваемые наборы элементов управления с назначенными им событиями. Мне нужно будет добавлять и удалять эти элементы управления во время выполнения. Это будет выглядеть так:
FlowLayoutPanel.Controls.Clear();
<< add new controls, assigning Click events with += >>
Я слышал, что назначение обработчиков событий с += может привести к утечке памяти (, точнее говоря, память не будет освобождена, пока приложение не завершит работу). Я хочу избежать этого. Я знаю, что могу написать некоторые функции, такие как здесь Как удалить все обработчики событий из элемента управления , чтобы найти все обработчики событий и удалить их, но это выглядит очень сложно.
Есть ли другой способ? Помогает ли вызов 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);
}