0

使用しているメモリを解放するために、次のコードで実行する必要があることはありますか?

  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)

コードはポップアップフォームにあり、破棄されるべきではありません。ポップアップするたびに、新しい画像がフォームに読み込まれます。ただし、アプリケーションのプロセスサイズは、そのコードブロックを通過するたびに増大し続けます。

objImage.Close()と.Flush()、objWebClient.Dispose()を試しました。プロセスサイズは、呼び出しのたびに4MBずつ大きくなります。古い画像がメモリに保存されているようなものです。

4

5 に答える 5

3

イメージはIDisposableを実装しているため、新しいイメージに置き換える前に古いイメージを破棄する必要があります。

次のようなものです(私に耐えてください、私はしばらくの間VBを使用していません):

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)
于 2009-05-19T20:55:27.603 に答える
2

MemoryStreamはIDisposableインターフェイスを実装しているため、使用が終了したら、そのオブジェクトに対してDisposeを呼び出す必要があります。

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

あなたの結論は正しかったと思います。(メモリストリーム内の)画像はメモリに残ります。

更新:Marcが指摘したように、Image.FromStreamでは、画像の存続期間中、ストリームを開いたままにする必要があります。これを解決するには、MemoryStream変数を画像と同じスコープで(フォームのフィールドとして)宣言する必要があります。画像をロードするときは、最初にMemoryStreamがすでに開いているかどうかを確認し、開いている場合は、変数を新しいストリームに使用する前に閉じて破棄する必要があります(m_imageStreamと呼びます)。イメージはIDisposableも実装しているため、同じことがそのイメージにも当てはまります。

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)
于 2009-05-19T20:50:02.763 に答える
2

これを試して:

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
于 2009-05-19T20:54:41.617 に答える
1

私はすでに1つの答えを出したことを知っていますが、それ以来考えていました...

あなたは、このフォームは決して破棄してはならないと言っていました。その場合、この画像の読み込みは正確にいつ行われますか? 私の以前の回答は、それがフォームShownイベントの間であると想定していました。ただし、フォームのLoadイベント中の場合は、合計で 1 回だけ発生する必要があります。

つまり、フォームの複数のインスタンスが作成されている場合を除きます。その場合、以前のフォームが再利用されていない場合、同じフォームの複数のコピーがメモリに読み込まれ、それぞれに独自の画像のコピーが存在することになります。

于 2009-05-19T21:12:33.873 に答える
0

あなたは試すことができます

set objImage = nothing
set objwebClient = nothing

多くの場合、ADO と同様に、明示的に何も設定しないと、適切に解放されません。

于 2009-05-19T20:46:29.200 に答える