Подтвердить что ты не робот

Когда использовать Слабые события?

Я ссылался на учебник MSDN о слабых событиях. Я понял основы. Я работаю над проектом, отличным от WPF, и мой класс подвергает определенные события. Мой вопрос в том, что слабые события полностью заменить старый шаблон событий? Хорошо ли использовать его для всех классов, которые подвергают событиям? Каковы побочные эффекты либеральных слабых событий?

4b9b3361

Ответ 1

Основываясь на чтении, которое я сделал, не существует никаких конкретных негативов для использования WeakEvents, за исключением того факта, что это более подробно. Кроме того, вы должны в большинстве случаев вручную отменить регистрацию событий, когда они вам больше не нужны. В некоторых случаях это невозможно. Например, на странице MSDN, на которую вы ссылаетесь, упоминается, когда вы должны использовать WeakEvents:

http://msdn.microsoft.com/en-us/library/aa970850.aspx

Некоторые сценарии по своей сути поддаются применению шаблона слабых событий. Одним из таких сценариев является привязка данных. При связывании данных обычно исходный объект полностью не зависит от объекта-слушателя, который является объектом привязки. Многие аспекты привязки данных WPF уже имеют шаблон слабых событий, применяемый в том, как реализованы события.

Единственный человек, который представил любой тип негатива для них - это блог:

http://blog.catenalogic.com/post/2011/11/23/A-weak-event-listener-for-WPF-Silverlight-and-Windows-Phone-7.aspx

Есть несколько недостатков в использовании слабых прослушивателей событий в целом:

  • Его обозначения уродливы, "оригинальный" способ .NET выглядит лучше.
  • Вы должны назвать событие строкой, которая сосет (если вы знаете лучший способ, свяжитесь со мной!)
  • Он может обрабатывать события только с обработчиком EventHandler
  • Вы становитесь ленивым разработчиком, не заботящимся о подписках.

По существу, они должны использоваться для событий, которые ваши объекты будут подписываться на всю длину своего существования, и только отключаться от того, когда объекты будут расположены. Для всех остальных предпочтительным является использование традиционных событий и регистрация/отмена событий вручную.

Ответ 2

Есть два вопроса, которые необходимо учитывать при слабых событиях:

  • Слабые события позволяют подписчикам подписываться на события (сообщения), даже не зная идентичности класса, поднимающего событие. В некоторых случаях может потребоваться даже необходимость. Однако в некоторых случаях это может привести к излишней сложности и уровню косвенности, что делает код более сложным для управления или контроля во время выполнения.
  • Основным недостатком использования слабых событий является то, что он может побуждать разработчиков пренебрегать тем, от которого они отписываются от событий (сообщений). В этом случае обработчики событий могут быть вызваны даже после того, как подписчики "выйдут из сферы действия". Рассмотрим подписчика, который явно не отписывается и становится сборщиком мусора, но еще не собирался сбор мусора. Менеджер слабых событий не сможет обнаружить это состояние, и из-за этого он все равно вызовет обработчик события этого абонента. Это может привести ко всем неожиданным побочным эффектам.

Подробнее см. Незначительный шаблон событий.
Смотрите эту исходного кода, который иллюстрирует эту проблему с помощью обмена сообщений плагина MvvMCross как слабый менеджер событий.

Ответ 3

Когда использовать слабые события?

От MSDN

Прослушивание событий может привести к утечке памяти

Итак, вы должны использовать слабые события с целью избежать этих утечек

Хорошо ли использовать его для всех классов, которые подвергают событиям? Каковы побочные эффекты либеральных слабых событий?

См. Почему реализация событий на С# не использует шаблон слабых событий по умолчанию?. Утечка из "сильных" событий не такая обычная, слабые события имеют стоимость исполнения и имеют семантическую разницу, которая может быть нежелательной в каждом контексте, неправильное использование слабой ссылки может привести к тому, что событие прерывается, чтобы не срабатывать (в отличие от неправильное использование обычного события, вызывающего утечку памяти)

Пример утечки памяти, которую можно было бы избежать

Статические классы и синглтоны являются злодеями, когда говорят об утечках памяти, когда они приобретают ссылку на какой-либо другой объект, они будут препятствовать сбору мусора и, таким образом, утечка объекта для продолжительности жизни приложения, здесь является примером, где я встречался с необходимостью слабой ссылки, чтобы избежать утечки памяти