La mémoire n’est pas libérée lorsque BitmapImage est défini sur null

J’ai une collection d’objects, chaque object contient une BitmapImage. J’ai cette collection liée à un FlipView. Lorsque l’utilisateur retourne une page dans FlipView, le BitmapInmage de l’object sélectionné est chargé à partir de ApplicationData et je règle BitmapImage de l’object précédent sur null pour libérer de la mémoire. Le problème est que la mémoire n’est jamais soulagée et que l’application se bloque après un certain temps de retournement. Lorsque je regarde la collection, seul l’élément réel a son ensemble BitmapImage, tous les autres l’ont comme null. Alors, comment puis-je soulager la mémoire?

La façon dont je charge les images:

StorageFile s = await ApplicationData.Current.LocalFolder.GetFileAsync(localFilename); BitmapImage bitmapImage = new BitmapImage(); using (var stream = await s.OpenAsync(FileAccessMode.Read)) { bitmapImage.SetSource(stream); } return bitmapImage; 

Edit: Je pense que le problème est peut-être la façon dont je charge l’image, je suppose que le stream de fichiers n’est pas libéré

J’ai rencontré un problème similaire avec les applications Windows Phone 7.

Une astuce qui a fonctionné pour moi a été de supprimer l’image de l’élément parent.

 grid1.Children.Remove(image1); image1 = null; 

Je ne sais pas si cela vous aidera dans votre situation.

Plus de détails sur ce problème dans mon article de blog .

Ce qui a fonctionné pour moi a été de définir la propriété UriSource sur null avant de définir l’object lui-même sur null.

Si ces images utilisent de grandes quantités de mémoire, il peut être judicieux de forcer Garbage Collection à libérer de la mémoire. Cela ne fonctionnera que si vous avez supprimé toutes les références fortes à la mémoire. Vous pouvez rencontrer des problèmes de performances si vous forcez trop le nettoyage de la mémoire, vous aurez donc envie de le tester. Par exemple, vous souhaiterez peut-être forcer la collecte uniquement après “l’annulation de” quelques images.

Vous pouvez forcer la récupération de place à l’aide de la méthode GC.Collect.

http://msdn.microsoft.com/en-us/library/bb384155.aspx

Si vous utilisez x: Bindings dans UWP, vous pouvez rencontrer un problème similaire. Toutefois, si vous exécutez Bindings.Update () après avoir effacé vos classes (supposons que votre image se trouve dans une classe, conservée dans une collection observable), .Clear () sur cette ObservableCollection, puis Bindings.Update (), alors vous constaterez que votre volonté retrouvera de l’espace libre.

Dans le paramétrage .net, une valeur nulle ne fait jamais rien – GC n’est pas lié et se produit quand il le souhaite. Au lieu de cela, vérifiez si l’image implémente IDisposable: si c’est le cas, vous devriez appeler Dispose () lorsque vous avez terminé. Généralement, vous feriez cela automatiquement via une déclaration “using”:

 using(var img = GetImage()) { // todo: some stuff involving img }