2010-11-08 6 views
1

hey. Je lis une image de stockage isolé lorsque l'utilisateur clique sur un élément comme celui-ci:IsolatedStorage entraîne l'épuisement de la mémoire

using (IsolatedStorageFile currentIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 

    using (var img = currentIsolatedStorage.OpenFile(fileName, FileMode.Open)) 
    { 

     byte[] buffer = new byte[img.Length]; 
     imgStream = new MemoryStream(buffer); 
     //read the imagestream into the byte array 
     int read; 
     while ((read = img.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      img.Write(buffer, 0, read); 
     } 

     img.Close(); 
    } 


} 

Cela fonctionne très bien, mais si je clique et-vient entre deux images, la consommation de mémoire ne cesse d'augmenter et exécute Mémoire insuffisante. Existe-t-il un moyen plus efficace de lire des images à partir d'un stockage isolé? Je pourrais mettre en cache quelques images en mémoire, mais avec des centaines de résultats, ça finit par prendre de la mémoire de toute façon. Aucune suggestion?

+0

À moins que je ne manque quelque chose, votre code ci-dessus ne fait rien avec imgStream –

+0

Désolé, imgStream est renvoyé. Le code ci-dessus est dans une méthode qui renvoie MemoryStream. – XSL

Répondre

2

Est-ce que vous disposez du MemoryStream à un moment donné? C'est la seule fuite que j'ai pu trouver. En outre, Stream a également une méthode CopyTo(). Votre code pourrait être réécrit comme:

using (IsolatedStorageFile currentIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
    using (var img = currentIsolatedStorage.OpenFile(fileName, FileMode.Open)) 
    { 
     var imgStream = new MemoryStream(img.Length); 

     img.CopyTo(imgStream); 

     return imgStream; 
    } 
} 

Cela permettra d'économiser beaucoup d'allocations de mémoire.

EDIT:

Et pour Windows Phone (qui ne définit pas un CopyTo()), remplacé la méthode CopyTo() avec son code:

using (IsolatedStorageFile currentIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
    using (var img = currentIsolatedStorage.OpenFile(fileName, FileMode.Open)) 
    { 
     var imgStream = new MemoryStream(img.Length); 

     var buffer = new byte[Math.Min(1024, img.Length)]; 
     int read; 

     while ((read = img.Read(buffer, 0, buffer.Length)) != 0) 
      imgStream.Write(buffer, 0, read); 

     return imgStream; 
    } 
} 

La principale différence est que le tampon est réglé relativement petit (1K). En outre, ajouté une optimisation en fournissant le constructeur de MemoryStream avec la longueur de l'image. Cela fait MemoryStream pré-allouer l'espace nécessaire.

+0

J'ai pensé que l'instruction Using ferait cela. Cependant, j'ai supprimé l'instruction Using et j'ai disposé manuellement, mais cela l'a quand même fait planter. – XSL

+0

Je suppose que vous utilisez le 'MemoryStream' ailleurs? Après l'avoir consommé, vous devez le jeter. Le 'using' s'assure que' Dispose() 'est appelé à la fin du bloc' using'. Vous devez en avoir fini avant ce point. –

+0

Merci. Le MemoryStream est renvoyé à la méthode appelante. Il semble que Windows Phone 7 n'a pas la méthode CopyTo car elle n'apparaît pas dans mon intellisense. Y a-t-il une autre méthode? – XSL

Questions connexes