我一直在研究垃圾收集和事件处理程序,在研究中,我遇到了一些似乎清除了事件处理程序所有匿名或其他订阅的代码。代码如下:
public event CustomEventHandler customHandler;
...
///Something somewhere subscribes to the customHandler
...
///Method used for cleanup
void ClearSubscriptions(CustomEventHandler handler){
if(handler == null){return;}
Delegate[] delegates = handler.GetInvocationList();
foreach(Delegate item in delegates){
handler -= (CustomEventHandler)item;
}
}
...
///And in the Dispose method
ClearSubscriptions(customHandler);
不幸的是,我找不到包含此代码的原始答案,因此我无法正确地表示感谢(如果有人知道在哪里可以随意编辑)。
现在,我对此的理解是,它似乎采用了事件处理程序并删除了对它的所有订阅(无论匿名还是其他方式),将其释放以进行垃圾回收。特别是,将此代码放入Dispose方法中似乎是一种故障保险方法,以确保此处理程序不会引起内存泄漏。
所以我的问题是,假设Dispose方法将调用此ClearSubscriptions方法,那么什么情况下会破坏ClearSubscriptions方法并使它以我期望的以外的方式工作?