使用事件处理程序动态加载用户控件 - 取消注册

Hug*_*ron 5 c# asp.net events user-controls event-handling

我有一个带有面板的表单,我可以动态加载多个用户控件.我为每个控件处理事件.

UserControl userControl1 = LoadControl("control.ascx") as UserControl;
userControl1.Event += new ControlEventHandler(userControl_Event);
this.Panel.Controls.Add(userControl1);

UserControl userControl2 = LoadControl("control.ascx") as UserControl;
userControl2.Event += new ControlEventHandler(userControl_Event);
this.Panel.Controls.Add(userControl2);

...
Run Code Online (Sandbox Code Playgroud)

现在,当我摆脱Panel上的控件时,我只是做了一个

this.Panel.Controls.Clear();
Run Code Online (Sandbox Code Playgroud)

Clear()函数是否负责摆脱事件或我应该做什么

foreach(Control control in this.Panel.Controls)
{
    UserControl userControl = control as UserControl;
    if(userControl != null)
    {
        userControl -= userControl_Event;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我清除()小组的内容之前?

基本上,我正在寻找一种方法来动态加载用户控件并处理他们的事件,而不会在我摆脱它们时造成泄漏.

谢谢!

编辑: 因为我的控件是在页面的Page_Init事件中创建的(每次都是动态加载的),说它们的生命周期不能超过页面的生命周期是否正确?根据我的理解,回发后控件不存在.每次都会创建一个新的.因此,我不应该取消注册该事件,因为它在下一页加载时甚至不存在该对象.那是对的吗?

Jas*_*yne 5

即使在清除了集合之后,该页面也将保留对动态实例化控件的引用,这将阻止在页面本身被收集之前收集控件.

在这种特殊情况下,这将很好,因为页面的生命周期很短.

但是,如果这是一个Windows窗体应用程序,那么内存将被有效泄露,直到窗体被释放.

通常,在释放事件所针对的对象时,最好取消订阅事件,因为这是绝大多数.net内存泄漏的来源.