Очистка подписок: что сломает этого самоочищающегося издателя событий? - PullRequest
0 голосов
/ 10 октября 2018

Я изучал сборщики мусора и обработчики событий, и в моих исследованиях я обнаружил некоторый код, который, по-видимому, очищает все подписки, анонимные или иные, от обработчика событий.Код выглядит следующим образом:

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 и заставлять его работать не так, как я ожидаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...