0

これは面白い。私たちは最後の日を費やして、プロセスサイズを拡大し続ける次の(レガシー)コードの問題にパッチを当てようとしました。これは、VisualStudio2003で行われます。

(MemoryStreamからの)画像といくつかのテキストとボタンを表示するフォームがあります。特別なことは何もありません。次のようになります。

  Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    MyBase.OnLoad(e)
    Try
      m_lblWarning.Visible = False

      m_grpTitle.Text = m_StationInterface.ProcessToolTitle
      m_lblMessage.Text = m_StationInterface.ProcessToolMessage

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

      objwebClient = New WebClient

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

      m_txtAcknowledge.Focus()
    Catch ex As Exception
      '*** This handles a picture that cannot be found without erroring'
      m_lblWarning.Visible = True
    End Try
  End Sub

このフォームは頻繁に閉じられ、開かれます。再度開くたびに、プロセスのメモリ使用量は約5MB増加します。フォームを閉じると、以前の使用法に戻ることはありません。リソースは、参照されていないフォームに割り当てられたままになります。フォームは次のようにレンダリングされます。

      m_CJ5Form_PTOperatorAcknowlegement = New CJ5Form_PTOperatorAcknowlegement
      m_CJ5Form_PTOperatorAcknowlegement.stationInterface = m_StationInterface
      m_CJ5Form_PTOperatorAcknowlegement.Dock = DockStyle.Fill
      Me.Text = " Acknowledge Quality Alert"

      '*** Set the size of the form'
      Me.Location = New Point(30, 30)
      Me.Size = New Size(800, 700)

      Me.Controls.Add(m_CJ5Form_PTOperatorAcknowlegement)

コントロールは、閉じた後にフォームから削除されます。

Me.Controls.Clear()

今。私たちは非常に多くのことを試みました。Disposedは何も行わず、実際、IDisposableインターフェイスは実際にはメモリにアクセスしないことを発見しました。毎回新しいCJ5Form_PTOperatorAcknowledgementフォームを作成しない場合、プロセスサイズは大きくなりません。ただし、そのフォームに新しい画像を読み込むと、プロセスサイズが継続的に大きくなります。

任意の提案をいただければ幸いです。

4

2 に答える 2

2

WebClientオブジェクトと、不要になった可能性のあるその他のマネージドアンマネージドリソースを破棄する必要があります。


objImage = New MemoryStream(objwebClient.DownloadData(sURL))
objwebClient.Dispose() ' add call to dispose

'using'ステートメントを使用することでコーディングするさらに良い方法は次のとおりです。


using objwebClient as WebClient = New WebClient      
objImage = New MemoryStream(objwebClient.DownloadData(sURL))      
end using

詳細については、googleおよびstackoverflowで「Dispose」および「IDisposable」パターンの実装を検索してください。

最後のヒント:可能であれば、メモリストリームを使用しないでください。RAMに保存する必要がない限り、画像をファイルから直接ロードします。

編集

私があなたのコードを正しく理解していれば、おそらく次のようなものが機能するでしょう:


Dim objImage As MemoryStream      
Dim objwebClient As WebClient      
Dim sURL As String = Trim(m_StationInterface.ProcessToolPicLocation)      
using objwebClient as WebClient = New WebClient      
  using objImage as MemoryStream = New MemoryStream(objwebClient.DownloadData(sURL))      
    m_imgLiftingEye.Image = Image.FromStream(objImage)
  end using
end using
于 2009-05-21T17:57:31.493 に答える
0

特にそれがリークしている理由はわかりませんが、.NETメモリプロファイラーの使用を検討することをお勧めします。これを使用してアプリケーションを実行すると、どのオブジェクトが破棄されていないかが非常にわかりやすくなり、その理由のトラブルシューティングに役立ちます。無料トライアルがありますが、購入する価値は十分にあります。

于 2009-05-21T17:52:06.077 に答える