Обработчики событий отмены подписки с помощью GetInvocationList

У меня есть некоторые события в моем базовом классе, к которым я хочу применить следующий шаблон в IDisposable или в Finalizer.

var onCategorizedMessage = this.OnCategorizedMessage.GetInvocationList().ToList();
foreach (var item in onCategorizedMessage)
    this.OnCategorizedMessage -= item;

Я бы повторил этот код один раз для каждого события.

Является ли это разумным и надежным способом обработки отказа от подписки на события для предотвращения утечек памяти?


person halfbit    schedule 12.06.2012    source источник
comment
Во многих случаях это не проблема. Собирается ли производитель пережить потребителя?   -  person Bryan Crosby    schedule 13.06.2012
comment
@BryanCrosby - я не знаю. Я создаю агент HubTransport и не знаю, что произойдет внутри кода хостинга. msdn.microsoft.com/en-us/library /dd877026(v=exchg.140).aspx   -  person halfbit    schedule 13.06.2012
comment
По логике, я бы подумал, что отписка — это ответственность самого отписавшегося. Кроме этого, нет особого смысла очищать список вызовов при удалении. Однако ЕСТЬ БОЛЬШАЯ точка в отказе от подписки на событие (от самого отписавшегося), когда оно удалено (чтобы предотвратить список вызовов события, имеющий делегата методу удаленного объекта).   -  person SimpleVar    schedule 13.06.2012


Ответы (1)


Нет необходимости делать это с помощью for или foreach, поскольку у вас есть доступ к резервному полю (в котором хранятся делегаты), вам просто нужно сделать следующее:

this.OnCategorizedMessage = null;

Для получения дополнительной информации вы можете проверить здесь: http://www.codeproject.com/Articles/864690/Simplifying-Events-in-NET

person J. Lennon    schedule 30.01.2015