меры предосторожности для предотвращения утечек памяти из-за добавления дескрипторов событий

Я собираюсь сделать графический интерфейс, который будет иметь динамически создаваемые наборы элементов управления с назначенными им событиями. Мне нужно будет добавлять и удалять эти элементы управления во время выполнения. Это будет выглядеть так:

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);
    }

8
задан Community 23 May 2017 в 10:34
поделиться