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

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, по-прежнему собираются через некоторое время, когда вы, например, переходите к тем же страницам или создаете те же элементы управления в течение некоторого времени, Я мог видеть, что новые объекты были созданы, но старые в какой-то момент собраны.

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

4b9b3361

Ответ 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 после выхода из пользовательского интерфейса.