2016-03-28 1 views
0

J'ai lu à peu près tous les articles ici concernant les tableaux d'octets dans le framework .net et le fonctionnement du GC, mais je suis toujours à court d'idées. Tout d'abord, le code, je travaille avec:VB.Net ByteArray Memory Leak

Public Sub SomeFunction(ByVal page As Integer, ByVal xml As String) 

     Dim fileBytes As Byte() 

     Using imageStream As New IO.FileStream(_imageFile, IO.FileMode.Open) 

      fileBytes = Array.CreateInstance(GetType(Byte), imageStream.Length) 

      imageStream.Read(fileBytes, 0, imageStream.Length) 
      imageStream.Close() 

     End Using 

     Using ms As New IO.MemoryStream(fileBytes) 

      Dim tiff As New Atalasoft.Imaging.Codec.Tiff.TiffFile 

      tiff.Read(ms) 

      Dim tag = tiff.Images(page - 1).Tags.LookupTag(58000) 

      If tag IsNot Nothing Then 
       tiff.Images(page - 1).Tags.Remove(tag) 
      End If 

      tag = New Atalasoft.Imaging.Metadata.TiffTag(58000, System.Text.Encoding.ASCII.GetBytes(xml)) 
      tiff.Images(page - 1).Tags.Add(tag) 

      tiff.Save(_imageFile) 

     End Using 

    End Sub 

Au début de la méthode, je suis en train fileBytes à Array.CreateInstance ... et puis je suis vers le bas la sauvegarde du fichier d'image. Cela signifie que je dois recharger le ByteArray à chaque fois parce que le fichier change que je regarde, donc je ne peux pas simplement réutiliser. Tout est à l'intérieur en utilisant des instructions et fileBytes DEVRAIT être détruit quand l'exécution quitte la méthode mais elle n'est JAMAIS effacée et la mémoire continue à s'incrémenter jusqu'à ce qu'une exception SystemOutOfMemoryException se produise. Si le GC ne libère pas de mémoire tant qu'il n'est pas censé être nécessaire, il ne le libère pas ici même si c'est nécessaire. Comment puis-je obtenir FileBytes pour libérer sa mémoire entre les appels à SomeFunction()?

Merci!

+0

Avez-vous essayé de définir 'fileBytes' en dehors de la fonction (comme une variable de niveau classe?) – vbnet3d

+0

Byte arrays dont/ne fuit pas. Il est plus likley que le fichier TIFF aimerait être éliminé. S'il a une méthode 'Dispose', utilisez-le. – Plutonix

+0

Ok, peut-être que "leak" n'est pas le bon mot, mais c'est certainement le fichierBytes() qui ne libère pas la mémoire car je l'ai parcouru et je peux l'observer chaque fois qu'il est défini. – DonnieDarko

Répondre

0

J'ai essayé plusieurs choses, en faisant passer le tableau d'octets de l'extérieur et en créant également une classe séparée qui effectue le traitement et qui est détruite à chaque tour. Ni travaillé. Donc, je viens de prendre un peu de recul et de regarder. Il n'était pas nécessaire que le tableau soit créé pour chaque page, puis le document est enregistré après l'ajout de l'annotation à une page individuelle. Je l'ai modifié pour que je reçoive le tableau une fois avant de faire défiler chaque page et d'ajouter les annotations pour cette page, puis de les sauvegarder juste une fois à la fin. Simple vraiment, juste besoin de prendre du recul et regarder différemment plutôt que d'assumer ce qui était déjà là était correct.