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!
Haben Sie versucht, 'fileBytes' außerhalb der Funktion zu definieren (als Variable auf Klassenebene?) – vbnet3d
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
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