Что такое легковесные события?
Несколько раз пробежался по термину lightweight event. Тексты не сопровождались какими-либо фрагментами кода, чтобы понять идею, стоящую за этим термином.
Я был бы очень признателен, если бы кто-нибудь мог объяснить, что такое легковесные события, и привести пример.
1 ответ:
Когда вы добавляете обработчик событий к событию (или группу методов к делегату, на самом деле), делегат будет содержать ссылку на объект, на котором находится группа методов, если это метод экземпляра.
Другими словами, объект, запускающий события, будет удерживать ваш объект, который получает события, пока он подписан на событие.Из-за этого, если вы закончили использовать этот объект, который получает события, он все еще живет (и реагирует на события), даже если вы закончили с его помощью и отпустите все ссылки (без отписки).
Это приводит к стремлению к
lightweight events, которые являются событиями, которые не держатся за ссылку.Это не предлагается по умолчанию в .NET framework out-of-box, поэтому, если вы хотите реализовать это, вам придется использовать методы доступа add и remove при объявлении вашего события вместе с WeakReference для хранения делегата, который передается через неявное значение параметр.
Затем, когда вы запускаете события, вы проверяете свою коллекцию WeakReference (вы должны поддерживать ее отдельно, чтобы сделать это), в частности свойстваIsAlive иTarget , Чтобы определить, был ли собран делегат. Если нет, то вы бы выполнили его, в противном случае, вы бы пропустили его (и сжали свой список, скорее всего).
Comments