A l’aide, le MapControl fait crasher mon application

Vous développez une application avec les APIs de Windows 10 et vous ne comprenez pas pourquoi le MapControl semble faire crasher de manière aléatoire votre application ? Ou encore, pourquoi depuis que vous avez rajouté ce contrôle pourquoi l’utilisation de la ram de votre application est affreusement excessive ? En réalité, vous n’êtes même pas sûr que le problème vienne de lui… Investigations autour du contrôle de carte.

EDIT du 13/01/2016 : Suite à des échanges avec les équipes Windows 10, les sources de la fuite mémoire seront corrigées directement dans la prochaine version du kit de développement Windows 10. Pour plus d’info : https://social.msdn.microsoft.com/Forums/onedrive/en-US/59d0f532-4f07-40cc-9004-cb18edf134f9/uwp-map-control-memory-leaks-and-continious-network-calls?forum=bingmapswindows8&prof=required

En réalité, les problèmes liés au MapControl sont assez nombreux, une petite recherche avec les mots clés « MapControl Memory Leak » sur votre moteur de recherche favori va vous permettre de voir que vous n’êtes pas le seul à avoir ce problème et qu’il existe un grand nombre de solutions à votre portée en fonction des cas, mais en réalité le problème est souvent le même.

Effectivement, si vous affichez une carte dans votre application c’est rarement uniquement pour faire jolie, vous allez ajouter des éléments dessus, qu’ils soient sous la forme de points d’intérêt (notamment avec les maps icons) ou sous la forme d’itinéraires. Toutes ces choses que vous ajoutez à l’ajout de votre carte doivent être supprimés de la carte avant de retirer la carte (en changeant de page donc).

Comment faire :
Nous allons tout simplement vider la liste contenant tous les éléments présents sur la carte au moment où l’on sort de notre page. (GlobalMapControl est le x:Name de mon map control dans la vue)

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
      this.GlobalMapControl.MapElements.Clear();
      base.OnNavigatedFrom(e);
}

Et à ce moment vous me dites : « Alors ok, tu es bien gentil, ça règle mon problème de crash mais mon app prend toujours 1Go de ram à chaque fois si mon utilisateur entre et sort de ma page. ». Et c’est là que ça devient particulièrement drôle. Vous vous souvenez toutes ces fois ou on vous a dit « Ce n’est pas bien d’appeler de Garbage Collector à la main, c’est pas bien de détruire les objets à la main ». C’est précisément ce que nous allons faire maintenant car lorsque l’on ne détruit pas manuellement la carte, elle continue de prendre de la place en ram ce qui a pour problématique majeur de saturer votre ram à terme. Oui, vos utilisateurs n’ont pas tous 16Go de ram !

Comment faire :
Après avoir vidé la carte de ces éléments nous allons la détruire et demander au garbage collector de venir finir le travail.

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
      this.GlobalMapControl.MapElements.Clear();
      this.GlobalMapControl = null;       
      GC.Collect();      
      base.OnNavigatedFrom(e);
}

Voilà, vous savez maintenant comment utiliser votre MapControl sans ruiner votre application. Heureux ?

2 réflexions au sujet de « A l’aide, le MapControl fait crasher mon application »

  1. Salut Valentin,
    Niveau mémoire ton fix à l’air d’être OK merci 😉
    Mais si tu lance fiddler sur ton app tu remarquera qu’au lancement de ton control map un background task ou autre est lancé est effectue des appels réseaux régulier. Hélas appeler le garbage collector ne supprime pas celui ci et les appels réseaux continuent après avoir quitter la page contenant la carte.
    Si je trouve un fix je te dit.
    Thierry

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *