Por que os dados MemoryStream não liberado da memória

votos
0

Há algo que precisa ser feito com o seguinte código para liberar a memória que ele usa?

  Dim objImage As MemoryStream
  Dim objwebClient As WebClient
  Dim sURL As String = Trim(m_StationInterface.PicLocation)

  objwebClient = New WebClient
  objImage = New MemoryStream(objwebClient.DownloadData(sURL))
  m_imgLiftingEye.Image = Image.FromStream(objImage)

O código é em um formulário pop-up que não deve nunca ter descartado. A nova imagem é carregada no formulário cada vez que aparece. No entanto, o tamanho do processo para a aplicação continua a crescer cada vez que ele faz isso através desse bloco de código.

Eu tentei objImage.Close () e .Flush (), objWebClient.Dispose (). O tamanho processo ainda cresce por um bom 4mb após cada chamada. É como a velha imagem é mantido na memória.

Publicado 19/05/2009 em 21:42
fonte usuário
Em outras línguas...                            


5 respostas

votos
3

Imagem implementa IDisposable, então você deve descartar a imagem antiga antes de substituí-lo por um novo.

Algo como (paciência comigo, eu não usei VB em quando):

Dim objImage As MemoryStream
Dim objwebClient As WebClient
Dim sURL As String = Trim(m_StationInterface.PicLocation)

objwebClient = New WebClient
objImage = New MemoryStream(objwebClient.DownloadData(sURL))

If m_imgLiftingEye.Image Is Not Nothing Then
    m_imgLiftingEye.Image.Dispose()
End If
m_imgLiftingEye.Image = Image.FromStream(objImage)
Respondeu 19/05/2009 em 21:55
fonte usuário

votos
2

Tente isto:

Function GetImage() As Image
    Using wc As New WebClient(), _
          ms As New MemoryStream(wc.DownloadData(m_StationInterface.PicLocation.Trim())

        GetImage = Image.FromStream(ms).Clone()
    End Using
End Function
Respondeu 19/05/2009 em 21:54
fonte usuário

votos
2

MemoryStream implementa a interface IDisposable, então você deve chamar Dispose no objeto quando terminar de usá-lo:

objImage = New MemoryStream(objwebClient.DownloadData(sURL))
m_imgLiftingEye.Image = Image.FromStream(objImage)
objImage.Dispose()

Eu acho que a sua conclusão estava certo; a imagem (no fluxo de memória) que permanecem na memória.

Update: Como Marc apontou Image.FromStream requer o fluxo de permanecer aberto para a vida útil da imagem. Para resolver esta variável o MemoryStream deve ser declarado no mesmo âmbito que a imagem (como um campo no formulário). Ao carregar a imagem, deve primeiro ser um cheque se o MemoryStream já está aberto e se assim for, feche e eliminá-lo antes de usar a variável para um novo fluxo (vamos supor que podemos chamá-lo m_imageStream). Desde a imagem também implementa IDisposable, o mesmo é verdadeiro para que uma:

If Not m_imageStream Is Nothing Then
    m_imageStream.Dispose()
End If

If m_imgLiftingEye.Image Is Not Nothing Then
    m_imgLiftingEye.Image.Dispose()
End If

m_imageStream = New MemoryStream(objwebClient.DownloadData(sURL))
m_imgLiftingEye.Image = Image.FromStream(m_imageStream)
Respondeu 19/05/2009 em 21:50
fonte usuário

votos
1

Eu sei que já deu uma resposta, mas eu estive pensando desde então ...

Você disse que esta forma nunca deve ser descartado. Nesse caso, quando é exatamente essa carga imagem acontecendo? A minha resposta anterior assumiu que era durante o evento forma mostrada. No entanto, se é durante o formulário de carga evento, que só deverá acontecer uma vez total.

Isto é, a menos que mais de uma instância do formulário está sendo criado. Se for esse o caso, e a forma anterior não está sendo reutilizado, você está terminando com várias cópias do mesmo formulário carregado na memória, cada um com sua própria cópia da imagem.

Respondeu 19/05/2009 em 22:12
fonte usuário

votos
0

Você poderia tentar

set objImage = nothing
set objwebClient = nothing

Muitas vezes, como com ADO, se você não definir explicitamente a nada não são liberados corretamente.

Respondeu 19/05/2009 em 21:46
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more