Есть ли простой способ перебора всех обработчиков, подписанных на данное событие? Моя проблема заключается в том, что клиенты подписываются, но забывают отказаться от подписки, так что происходит утечка памяти. Мне нужен способ для объекта отключить все обработчики его событий в методе Dispose, чтобы утечка не произошла - по крайней мере, не из-за событий.C# Как отменить подписку на все обработчики событий из данного события?
ответ
Установить нуль на мероприятие: MyEvent = null;
Но это действительно лучше, чтобы клиенты отписку от вашего мероприятия.
Альтернативный подход заключается в использовании так называемого «слабого делегата». Когда вы используете этот метод, событие ссылается на клиентов только с использованием WeakReference
, который не сохраняет их в памяти. Клиенты будут собирать мусор, когда они больше не ссылаются на другую часть приложения (и обработчик также может быть незарегистрирован автоматически при получении клиента).
Это обычно используется для решения проблемы с «забыванием» клиентов, чтобы отказаться от подписки на событие .NET, поэтому кажется, что это может быть хорошо подходит для вашей проблемы.
- Dusing Campbell имеет хороший article about weak delegates.
- Мне тоже понравилось overview at CodeProject, в котором обсуждается большинство сценариев.
- Weak Events также используются в WPF, но этот подход кажется немного сложным (для меня).
Утечка памяти происходит только в том случае, если другой объект (слушатель) умирает перед вашим объектом (источником события). В этом случае источник событий все еще сохраняет ссылку на слушателя, что предотвращает сбор слушателя. Когда источник события умирает, может быть также собран незарегистрированный слушатель.
Если источник события умирает перед слушателем, это не мешает прослушиванию слушателя позже, когда все остальные ссылки на него установлены в нуль.
Это означает, что источник события Метод Dispose не подходит для решения этой проблемы. Это может быть разрешено только в коде слушателя. Просто говорите, вы ничего не можете сделать, кроме как попросить ваших клиентов написать чистый код.
На момент написания статьи наиболее точный ответ наименее популярен.
Вы можете аннулировать обработчик событий, но это будет заблокировано в любом случае после того, как его владелец будет заблокирован. Неправильно быть суперпорядочным, но, как говорит Алекс, это не проблема.
Исходный класс Ади позволит собирать объекты для прослушивания, когда он сам собран, нет сомнений. Таким образом, проблема заключается в том, что исходный объект Adi остается открытым, возможно, из некоторой длинной цепочки ссылок в коде клиента.
Следующее сообщение в блоге также рассматривает решение, которое Adi описывает и объясняет, почему это не нужно.
- 1. Как удалить все обработчики событий из события?
- 2. Отменить все обработчики событий мыши в javascript?
- 3. Можно ли удалить все обработчики событий данного элемента в javascript?
- 4. Как удалить все обработчики событий?
- 5. Отменить подписку обработчиков событий с помощью GetInvocationList
- 6. Отменить подписку на событие
- 7. Отменить все события из Page_Load
- 8. C# пользовательские обработчики событий
- 9. Отменить подписку на REDIS
- 10. Как отменить подписку на Paypal?
- 11. Как узнать, когда закончились все обработчики событий?
- 12. Как можно удалить все обработчики событий события «Click» кнопки «Button»?
- 13. Отменить подписку на анонимный метод в C#
- 14. Как очистить подписку на события в C#?
- 15. WinForms и обработчики событий
- 16. Отменить подписку Компоненты форм из долгоживущих источников событий - когда?
- 17. Как работает отменить подписку?
- 18. Удалить все обработчики событий из html5 Canvas
- 19. Jquery, удалить все обработчики из пользовательского события
- 20. C# Обработчики событий
- 21. Обработчики событий C#
- 22. Автоматически создавать пустые обработчики событий C#
- 23. C#, обработчики событий и Threading
- 24. C# обработчики событий мыши
- 25. javaFX. Удалить все обработчики событий (фильтры)
- 26. Как записывать события и обработчики событий в C#?
- 27. Как отменить все события из пользовательского объекта?
- 28. События и обработчики событий EventBus в Java
- 29. наследования и обработчики событий C#
- 30. Как отменить подписку на подписку, установленную службой Iron Router waitOn?
Это не представляется возможным установить событие NULL, в C#. –
На самом деле это возможно, если вы находитесь внутри класса, где было объявлено событие. –
Вы правы. –