UWP скомпилировал привязку x: Bind производит утечки памяти
При разработке приложения UWP я недавно обнаружил немало утечек памяти, которые не позволяли собирать мои страницы GC.
У меня есть ContentPresenter на моей странице, например:
<ContentControl Grid.Column="0" Grid.Row="1" Content="{x:Bind ViewModel.Schedule, Mode=OneWay}">
</ContentControl>
После удаления содержимого или его замены динамической страницей {Binding} - страница собирается, когда я перехожу от нее. В противном случае он остается в памяти.
Это ошибка, или я делаю что-то неправильно? Есть ли способ освободить и очистить ВСЕ привязки при навигации?
UPDATE:
Кажется, это известная проблема внутри Microsoft, как было указано здесь.
Но, насколько я могу видеть в своем собственном тесте/приложении, данные, которые сохраняются x: Bind, по-прежнему собираются через некоторое время, когда вы, например, переходите к тем же страницам или создаете те же элементы управления в течение некоторого времени, Я мог видеть, что новые объекты были созданы, но старые в какой-то момент собраны.
Таким образом, для меня это не является серьезной проблемой, вызывающей нехватку памяти, она не позволяет собирать объекты так быстро, как динамическое связывание.
Ответы
Ответ 1
Я создал ошибку при подключении к Microsoft из-за этой проблемы.
https://connect.microsoft.com/VisualStudio/feedback/details/3077894/memory-leaks-in-c-uwp-apps-using-compiled-x-bind-bindings
Работа над этой проблемой заключается в явном вызове Bindings.StopTracking() на странице Разгруженный обработчик событий. Это потому, что скомпилированные привязки не используют шаблон "слабый случай" и не подписываются непосредственно на событие PropertyChanged из файла INotifyPropertyChanged. Это причина утечки памяти. Чтобы отменить подписку на события, вы можете вызвать Bindings.StopTracking(). Скомпилированный код привязки не вызывает его автоматически.
Ответ 2
Да, это вызывает утечку памяти, чтобы предотвратить следующие действия:
- Используйте IoC как UnityContainer и создавайте ViewModel или View ContainerControlLifeTime
- Назначить значение null для свойства ViewModel на xaml.cs после выхода из пользовательского интерфейса.