|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.03.2016, 11:38 | #1 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
WeakEventManager. Как эта штука работает???
Что-то события мне тяжко даются. Кто-нибудь может объяснить как работает данный класс. Точнее сказать унаследованный от него класс?
По словам автора книги, он поможет освобождать память, если вдруг прослушиватель исчезнет раньше, чем издатель. Т.е. как я понял, если у нас прослушиватель напрямую подключен к издателю, и экземпляр прослушивателя выходит за рамки видимости кода или мы его пытаемся удалить, то он не удалится, поскольку ссылка на него сохранена в издателе. Правильно я понял? Соответственно у нас неиспользуемый экземпляр класса будет занимать место в памяти, что ни есть хорошо. А вот этот шаблон поможет нам освобождать это место. Но я не могу понять каким образом. Вроде теже самые действия, но только через свои методы. Вот пример кода класса производного от шаблона из книги: Код:
И да. Есть еще одна проблема. Когда я использую этот класс и подключаю пространство имен System.Windows компилятор отказывается видеть базовый класс WeakEventManager. И выдает следующее: Код:
С чем это может быть связано? Последний раз редактировалось max_prorok; 17.03.2016 в 13:22. |
17.03.2016, 16:17 | #2 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
Итак, у меня появились некоторые домыслы по поводу работы этого шаблона.
Хочу поделиться ими с вами, и хочу услышать ваше мнение, прав я или нет. Есть у меня догадки, что внутри этого класса есть групповой делегат или еще какая-то переменная, которая держит в себе методы RecieveWeakEvent из интерфейса IWeakEventListener, от которого должны наследоваться классы-прослушиватели. При этом, метод RecieveWeakEvent держит в себе обработчик. Назовем ее ListenerList. Изначально, эта переменная пуста. Когда мы вызываем метод AddListener, мы обращаемся к базовому методу ProtectedAddListener, который добавляет наш обработчик в переменную ListenerList, а за одно и проверяет, была ли наша переменная ListenerList пустая. И если ListenerList была пуста, то запускает метод StartListening, который всего лишь подписывает на событие издателя метод CarDealer_NewCarInfo, в котором идет вызов метода DeliverEvent базового класса. А DeliverEvent непосредственно пробегает по всей ListenerList и вызывает методы, которые в нее записаны. В случае, если мы с помощью метода RemoveListener удалим все обработчики из переменной ListenerList, то вызовется метод StopListening, который в свою очередь в подписках оставляет только метод CarDealer_NewCarInfo, который вызывает метод базового класса DeliverEvent. Но поскольку, внутри ListenerList пусто, то он соответственно не вызывает никаких обработчиков. Теория моя хороша, но есть в ней один тонкий момент, который для меня остался загадкой. А именно: если все так и есть как я описал, то зачем в методе StartListening использовать именно такую строку: Код:
Код:
Последний раз редактировалось max_prorok; 17.03.2016 в 16:43. |
17.03.2016, 16:24 | #3 | |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
Цитата:
И остается вопрос тогда касаемо StopListening. И собственно вопрос касаемо освобождения памяти. Если код вышел за пределы видимости экземпляра класса-прослушивателя, но при этом ссылка на его метод осталась внутри ListeningList, то каким образом тогда сборщик мусора удалит его? P.S. Ну и вопрос не виденья System.Windows так же остается открытым. Последний раз редактировалось max_prorok; 17.03.2016 в 16:27. |
|
17.03.2016, 16:51 | #4 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
Кажется решил вопрос с невиденьем System.Windows. Дело в том, что это пространство имен находится в сборке WindowsBase, соответственно, в библиотеке WindowsBase.dll. А я ее не подключал, поэтому и не видит.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Объясните как эта прога работает. | МаксDragon | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 13.12.2014 00:00 |
как работает эта программа? C++ степень | severest | Помощь студентам | 7 | 03.07.2012 21:48 |
Объясните как работает эта функция перевода из десятичной в восмеричную систему? | severest | Помощь студентам | 1 | 02.07.2012 05:57 |
как работает эта программа(Алгоритм Рабина-Карпа с++)??? | Lodas | Общие вопросы C/C++ | 1 | 18.12.2011 11:58 |
На чём зделана эта штука | HellMercenariess | PHP | 3 | 04.08.2009 13:01 |