2017-01-26 1 views
1

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?

+0

Comment mettre en cache la page (NavigationCacheMode)? BTW vous ne devriez pas utiliser GC.Collect() ... –

Répondre

1

Sans un repro complet de ce que vous faites, il est difficile d'être certain, mais il semble que le problème n'est pas de nettoyer ViewModels, mais les pages utilisées pour les afficher. Si vous continuez à naviguer vers l'avant, vous vous retrouverez avec plusieurs pages utilisant chacune de la mémoire. (Les outils de profilage de la mémoire vous montreront où la mémoire est utilisée et vous devrez les utiliser pour vérifier le problème réel.)

En supposant que le problème concerne la création de plusieurs pages, vous devez revenir en arrière après avoir consulté la page de détails. à la page principale, pas en avant.
Si vous allez de l'avant, une autre copie de la page principale sera créée et cette duplication de page et de contenu sera la cause de la fuite. Si vous revenez, la page qui vous reste peut être collectée. Notez que cela ne sera pas nécessairement fait immédiatement si.Si vous rencontrez toujours le problème de fuite de mémoire lorsque vous revenez de la page de détails à la page principale, le problème sera quelque chose dans la page de détails empêchant la collecte de la mémoire. Plus de détails (et idéalement une reproduction) seront nécessaires pour identifier la cause.