我将制作一个 GUI,该 GUI 将动态创建一组控件,并为其分配事件。我需要在运行时添加和删除这些控件。它看起来像这样:
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);
}