MVVM Light Listener не выпускает / детерминированную финализацию для зарегистрированного объекта?

У меня есть дочернее окно со связанной виртуальной машиной, которая создается каждый раз, когда я прошу открыть дочернее окно. когда дочернее окно открывается, оно регистрирует прослушиватель для сообщения MVVM Light. После того, как я закрою окно, я почти уверен, что освобождаю все ссылки на него, но на самом деле я не вызываю dispose, потому что он не реализует IDisposeable.

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

Как я могу быть уверен, что моя предыдущая виртуальная машина, которая зарегистрировалась для прослушивания сообщения, действительно была выпущена и больше не активна. Есть ли детерминированный способ сделать это?


person codeputer    schedule 12.06.2011    source источник


Ответы (3)


Всякий раз, когда вы регистрируете сообщение, вы должны убедиться, что вы также отменяете регистрацию сообщения. Чтобы отменить регистрацию, вы можете использовать метод Cleanup для классов, производных от ViewModelBase. В других случаях, например. представление, вы должны реализовать метод, вызываемый при выгрузке представления, например, путем перехвата и обработки события unloaded в элементе управления или представлении. В этом методе вы затем вызываете Messenger.Unregister(EventTarget).

Такое поведение является причудой текущей версии инструментария, и Лоран знает об этом.

person AxelEckenberger    schedule 12.06.2011
comment
Очистка не работает должным образом, т.е. не удаляет ссылки. - person Zeeshan Ajmal; 01.10.2013

Как вы написали обработчик сообщения в виртуальной машине? Похоже, вы, вероятно, указываете на метод внутри той же виртуальной машины, которая регистрируется для сообщения. Это заставляет класс Messenger поддерживать ссылку на виртуальную машину и предотвращать ее сборку мусора (см. здесь для обсуждения). Есть два решения: внедрить IDisposable и отменить регистрацию всех сообщений для экземпляра виртуальной машины или просто отменить регистрацию всех сообщений из экземпляра виртуальной машины при закрытии дочернего диалогового окна. Лично я бы сделал и то, и другое, чтобы гарантировать, что вся сеть объектов будет выпущена.

person Mike Post    schedule 12.06.2011

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

person Ehsan Zargar Ershadi    schedule 12.06.2011