Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 为什么MemoryStream数据没有从内存中释放_Vb.net_Memory Management_Memorystream - Fatal编程技术网

Vb.net 为什么MemoryStream数据没有从内存中释放

Vb.net 为什么MemoryStream数据没有从内存中释放,vb.net,memory-management,memorystream,Vb.net,Memory Management,Memorystream,是否需要使用以下代码来释放它使用的内存 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_imgLifti

是否需要使用以下代码来释放它使用的内存

  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。就像旧图像保存在内存中一样。

你可以试试

set objImage = nothing
set objwebClient = nothing

通常,与ADO一样,如果未显式将其设置为nothing,则无法正确释放。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)
试试这个:

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
实现IDisposable,因此在用新映像替换旧映像之前,应该先处理旧映像

类似于(请注意,我已经有一段时间没有使用VB了):


我知道我已经给出了一个答案,但从那以后我一直在想

你说过这张表格不应该被处理。在这种情况下,该图像加载的确切时间是什么时候?我之前的回答假设是在表格显示的事件期间。但是,如果是在表单事件期间,则应该只发生一次


也就是说,除非创建了多个表单实例。如果是这种情况,并且之前的表单没有被重用,那么最终会在内存中加载同一表单的多个副本,每个副本都有自己的映像副本。

我不认为MemoryStream实现了IDisposable。这也是我的第一个想法,但查看映像类的“FromStream()文档:“您必须在映像的生命周期内保持流打开。“这是不好的;我建议缓存映像并从中加载映像类,而不是在请求生命周期的某个时刻保留需要处理的多个对象。hypoxide:System.IO.Stream实现了IDisposable,MemoryStream继承了IDisposable。我用一个我尝试过的代码示例更新了我的帖子,并发现它可以工作。贝姆罗斯和我攻击的是同一个目标,但目标不同:图像和流都需要处理。(好几年没写VB代码了,这是一次有趣的经历)我知道你在做什么,但是m_imageStream是什么?此外,MemoryStream就在这里声明。我想,它应该什么都不做?我的代码看起来就像那样,进程大小仍然在增长。我想他需要这样做,我的答案也是如此。我也考虑过,但对话框窗体创建的唯一地方是在加载期间。也可能是激活的事件。顺便说一句,克隆是个聪明的主意。做一个函数也是如此。
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)