Ciao a tutti.
come da oggetto, ottengo un'OutOfMemoryException quando cerco di caricare in una list una serie di immagini per successiva trasformazione in array e visualizzazione.
Le immagini sono prese da una DataTable precedentemente popolata con apposita Query
Il problema è che l'eccezione viene generata quando la routine che carica le immagini nella list viene eseguita la seconda volta. Nessuna eccezione viene generata alla prima esecuzione.
Ciò mi fa capire che la memoria è abbastanza per completare correttamente l'operazione, ma mi sto dimenticando di liberare risorse inutilizzate da qualche parte e alla seconda chiamata la memoria è effettivamente esaurita.
Solo che non riesco a capire dove, né come.
Ovviamente la DataTable è identica ogni volta (non più di 120 MB).
Altro indizio: se riduco la DataTable NON ottengo più l'eccezione, quindi credo che sia veramente un problema di memoria esaurita.
Sono ad un punto morto.
Ringrazio anticipatamente tutti gli utenti del forum, ed in maniera particolare chi volesse darmi un piccolo aiuto per risolvere il problema.
Di seguito il codice incriminato.
codice:
Public Structure tileImage
...
Dim tile_image As Drawing.Image
...
End Structure
Public Structure tileServer
Dim tile_images As tileImage()
...
Sub initializeTileServer(ByVal inputDataTable As DataTable)
Dim tileList As New List(Of tileImage)
Dim myTile As tileImage
Dim myBytesBuffer As Byte()
Dim myMemoryStream As IO.MemoryStream
' riduco l'array (magari precedentemente popolato) a un array nullo
Me.tile_images = {}
' scorro tutta la datatable
For i = 0 To inputDataTable.Rows.Count - 1
' carico lo stream di byte
myBytesBuffer = inputDataTable.Rows(i).Item("raster_image")
' metto lo stream in un nuovo memorystream
myMemoryStream = New IO.MemoryStream(myBytesBuffer, 0, myBytesBuffer.Length)
' riduco l'array a un array nullo
myBytesBuffer = {}
'**** QUI OTTENGO L'OUTOFMEMORY EXCEPTION (LA SECONDA VOLTA) ****
' genero l'immagine dallo stream
myTile.tile_image = System.Drawing.Image.FromStream(myMemoryStream)
'***********************************************************
' libero la risorsa
myMemoryStream.Dispose()
' aggiungo l'immagine generata alla list
tileList.Add(myTile)
Next
' ritrasformo la lista in un array, ripopolando così l'array
tile_images = tileList.ToArray
' elimino tutti gli elementi dalla lista
tileList.Clear()
End Sub
Lorenzo