c# xaml windows-runtime winrt-xaml uwp

c# - Enlace compilado UWP x: Bind produce pérdidas de memoria



xaml windows-runtime (2)

Al desarrollar una aplicación UWP, recientemente encontré algunas pérdidas de memoria que impiden que GC recoja mis páginas. Tengo un ContentPresenter en mi página como:

<ContentControl Grid.Column="0" Grid.Row="1" Content="{x:Bind ViewModel.Schedule, Mode=OneWay}"> </ContentControl>

Después de eliminar el Contenido, o reemplazarlo con {Binding} dinámico - la página se recopila cuando navego desde ella. De lo contrario queda en la memoria. ¿Es error o estoy haciendo algo mal? ¿Hay una manera de liberar y borrar TODOS los enlaces en la navegación?

ACTUALIZACIÓN: Parece ser un problema conocido dentro de Microsoft como se indicó here . Pero por lo que puedo ver a través de mi propio uso de prueba / aplicación, los datos que se conservan mediante x: Bind aún se recopilan después de un tiempo, cuando, por ejemplo, navega a las mismas páginas o crea los mismos controles durante algún tiempo. . Pude ver que se crearon nuevos objetos, pero se recolectaron los antiguos en algún momento.

Entonces, para mí, no parece ser un problema drástico que se origine en la memoria, solo no permite que los objetos se recojan tan rápido como lo hará el enlace dinámico.


He creado un error en Microsoft Connect debido a este problema.

https://connect.microsoft.com/VisualStudio/feedback/details/3077894/memory-leaks-in-c-uwp-apps-using-compiled-x-bind-bindings

La solución para este problema es llamar explícitamente a Bindings.StopTracking () en la página del controlador de eventos descargados. Es porque los enlaces compilados no usan el patrón de "evento débil" y se suscriben al evento PropertyChanged de INotifyPropertyChanged directamente. Es una causa de pérdida de memoria. Para cancelar la suscripción de eventos, puede llamar a Bindings.StopTracking (). El código de enlaces compilado no lo llama automáticamente.


Sí, causa una pérdida de memoria, para evitar que pueda usar los siguientes pasos:

  1. Use IoC como UnityContainer y cree su ViewModel o View ContainerControlLifeTime
  2. Asigne nulo a la propiedad ViewModel en xaml.cs una vez que salga de la interfaz de usuario.