Вопрос по поводу отсутствия RemoveHandler в функции приложения WPF
У нас есть несколько сценариев в нашем приложении WPF/MVVM, где окно создается и открывается в рамках метода. Очень упрощенный пример:
Private Sub subOpenWindow
Dim myViewModel = New Viewmodel1 'create viewmodel that Window1 will use as datacontext
AddHandler myViewModel.SomeEvent, AddressOf subHandleSomeEvent
Dim myWindow = New Window1(ViewModel1)
myWindow.Show
End Sub
Private Sub subHandleSomeEvent
'do some stuff
End Sub
Теперь - мы обсуждаем, вызывает ли использование AddHandler без последующего RemoveHandler (как правило, большое нет-нет) проблемы с памятью, учитывая, что объявление AddHandler не указано и используется внутри метода subOpenWindow, и нет очевидных средств выполнения вызова RemoveHandler. Мы могли бы переместить объявление viewmodel на более глобальный уровень, но это не кажется таким чистым.
Вопрос в том, нужен ли RemoveHandler в этом сценарии? Или очистит сборщик мусора после закрытия окна?
1 ответ
Вы можете обработать закрытое событие Window, чтобы удалить обработчик. Как таковая, ссылка, созданная текущим классом (тот, который содержит обработчик), действительно сохраняет myViewModel в памяти. Альтернативой может быть использование слабых событий - подробности см. Здесь.