清算订阅:什么会破坏这个自净事件发布者?

时间:2018-10-10 16:54:12

标签: c# garbage-collection delegates event-handling

我一直在研究垃圾收集和事件处理程序,在研究中,我遇到了一些似乎清除了事件处理程序所有匿名或其他订阅的代码。代码如下:

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方法并使它以我期望的以外的方式工作?

0 个答案:

没有答案