Я изучал сборщики мусора и обработчики событий, и в моих исследованиях я обнаружил некоторый код, который, по-видимому, очищает все подписки, анонимные или иные, от обработчика событий.Код выглядит следующим образом:
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 вызовет этот метод ClearSubscription, в каких ситуациях он будет нарушать метод ClearSubscription и заставлять его работать не так, как я ожидаю?