我使用Reflection动态创建UserControls: UserControl myConmtrol =(UserControl)Activator.CreateInstance(t);
UserControl可以处理Closing事件,但我不知道处理程序的名称。
当托管UserControl的Window关闭时,我从其父窗口中删除UserControl,它从Window中消失:一切似乎都没问题。
但是,如果我再次打开并关闭UserControl,我可以在调试器中看到Closing事件被处理两次,一次是当前的UserControl,也是前一个仍处于活动状态的UserControl。
理论上,不再引用的UserControl应该是GarbageCollected。 如何强制将其杀死/删除/处置?至少有没有办法禁止它处理事件?
由于
答案 0 :(得分:0)
不确定没有更多详细信息但我会启动并检查是否有任何未删除的事件处理程序
Do I need to remove event subscriptions from objects before they are orphaned?
答案 1 :(得分:0)
我必须应对Winforms中的相同情况,我在另一个用户控件中动态创建一个用户控件(比如说“HostControl”中的“DynControl”)。
“HostControl”中没有Closing事件。所以我使用HostControl的Disposed事件来释放资源:
this.Disposed += (s, e1) =>
{
DynControl.Click -= += new EventHandler(MyClickHandler);
this.Controls.Remove(DynControl);
DynControl.Dispose();
};
答案 2 :(得分:0)
在不知道名字的情况下删除处理程序的答案:
public void RemoveHandlerOfUserControl(UserControl uc)
{
MulticastDelegate dlg = MyEvent;
Delegate[] handlers = dlg.GetInvocationList();
foreach (Delegate d in handlers)
{
if (d.Target == uc)
{
this.RemoveHandler(MyEvent, d);
}
}
}
此方法必须位于声明事件的对象中。