2016-03-28 18 views
0

Ich habe so ziemlich jeden Post hier gelesen über Byte-Arrays in der. NET-Framework und wie der GC funktioniert, aber ich bin immer noch ratlos. Zunächst einmal, der Code mit denen ich arbeite:VB.Net ByteArray Speicherleck

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 

Zu Beginn des Verfahrens, ich fileBytes setze ... Array.CreateInstance und dann nach unten hin ich die Image-Datei speicherte. Das bedeutet, dass ich das ByteArray jedes Mal neu laden muss, da sich die Datei ändert, die ich betrachte, sodass ich sie nicht einfach wiederverwenden kann. Alles ist innerhalb von Anweisungen und fileBytes sollte zerstört werden, wenn die Ausführung die Methode verlässt, aber es wird nie gelöscht und der Speicher steigt weiter, bis eine SystemOutOfMemoryException auftritt. Wenn der GC Speicher nicht freigibt, bis er angeblich gebraucht wird, wird er hier nicht freigegeben, obwohl er benötigt wird. Wie kann ich fileBytes veranlassen, sein Gedächtnis zwischen Anrufen zu SomeFunction() freizugeben?

Danke!

+0

Haben Sie versucht, 'fileBytes' außerhalb der Funktion zu definieren (als Variable auf Klassenebene?) – vbnet3d

+0

Byte-Arrays dont/cant leak. Es ist einfacher, dass die TIFF-Datei entsorgt werden soll. Wenn es eine Dispose-Methode hat, verwenden Sie sie. – Plutonix

+0

Ok, vielleicht ist "leak" das falsche Wort, aber es ist definitiv die DateiBytes(), die den Speicher nicht freigibt, da ich durch sie gegangen bin und sie jedes Mal inkrementieren kann, wenn sie gesetzt wird, und dann wird sie nie wieder freigegeben. – DonnieDarko

Antwort

0

Ich habe ein paar Dinge ausprobiert, indem ich das Byte-Array von außen übergebe und auch eine separate Klasse erzeuge, die die Verarbeitung durchführt und jede Runde zerstört wird. Keine funktionierte. Also habe ich einfach einen Schritt zurück gemacht und es mir angesehen. Das Array musste nicht für jede Seite erstellt werden, und das Dokument wurde nach dem Hinzufügen der Anmerkung zu einer einzelnen Seite gespeichert. Ich änderte es, so dass ich das Array einmal vor dem Durchlaufen jeder Seite und Hinzufügen der Anmerkungen für diese Seite und dann nur einmal am Ende speichern. Ganz einfach, nur um einen Schritt zurück zu machen und es anders zu betrachten, als anzunehmen, dass es schon da war.