J'ai développé une application UWP qui utilise MvvmLight, mais il y a quelques fuites de mémoire. Mon application contient 2 pages principales:UWP: comment nettoyer correctement un ViewModel?
- la Accueil page contenant une liste des formes
- la Détails page, contenant tous les détails de la forme sélectionnée (données, photos ...)
Chaque fois que j'ouvre la Détails page, je peux voir que 25 Mo plus sont utilisés par la mémoire: donc après une douzaine de chargements de page , L'application devient plus lent ...
Mes ViewModels héritent de ViewModelBase, je peux utiliser Nettoyage().
J'essaie donc de l'utiliser dans DetailsViewModel comme ceci:
public override void Cleanup()
{
Messenger.Default.Unregister<SendImageOnDetailsViewModel>(this);
Messenger.Default.Unregister<SendDeletedImageOnDetailsViewModel>(this);
VComponentBoms = null;
VComponentOrders = null;
VCoreOrders = null;
CarForm = null;
base.Cleanup();
}
Je l'appelle directement sur le DetailsViewModel, après que l'utilisateur a sauvé une forme, avant qu'il va revenir à la HomeViewModel :
Cleanup();
NavigationService.NavigateTo<HomeViewModel>(this, new object[] { }, "RefreshForms", new object[] { }, false);
Je demande aussi quand l'utilisateur revient à la page d'accueil à travers le Retour bouton, par AppBackButtonPressed() dans App.xaml.cs:
if (cur.GetType() == typeof(DetailsViewModel))
{
cur.Cleanup();
GC.Collect();
}
Cela fonctionne sans erreur, mais il ne semble pas être la bonne façon de le mettre en œuvre ...
sur certains échantillons, le nettoyage () est augmenter l'événement de clôture de la page, qui n'existe pas sur UWP.
Y a-t-il une façon plus propre de faire cela avec UWP?
Comment mettre en cache la page (NavigationCacheMode)? BTW vous ne devriez pas utiliser GC.Collect() ... –