把数据库里的图片库动态生成缩略图
有8万条图片记录
循环动态生成
但随着运行,很快占满了内存
然后就内存不足了
代码如下:
For i = startId To ProductTable.Rows.Count - 1
                Try
                    Dim imagedata As Byte(), streamImage As Stream
                    imagedata = theProduct.GetDetails(ProductTable.Rows(i).Item("ProductId")).ProductPicture
                    Dim ms As MemoryStream = New MemoryStream(imagedata)
                    Dim img As Image = Image.FromStream(ms)
                    Dim imgPath As String = "ProductImage/"
                    If Not Directory.Exists(imgPath) Then
                        Dim imgDirectory As DirectoryInfo = Directory.CreateDirectory(imgPath)
                    End If
                    Dim iWidth As Integer = img.Width
                    Dim iHeight As Integer = img.Height
                    Dim aimWidth = 75
                    Dim aimHeight = (aimWidth / iWidth) * iHeight
                    img = img.GetThumbnailImage(aimWidth, aimHeight, Nothing, (New IntPtr).Zero)
                    img.Save(imgPath & ProductTable.Rows(i).Item("ProductId") & ".jpg")
                    ms.Close()
                    img.Dispose()
                Catch ex As Exception
                    If Not Directory.Exists("ImgLog/") Then
                        Dim imgDirectory As DirectoryInfo = Directory.CreateDirectory("ImgLog/")
                    End If
                    Dim fileInfo As FileInfo = New FileInfo("ImgLog/" & ProductTable.Rows(i).Item("ProductId") & ".log")
                    fileInfo.Delete()
                    Dim fw As StreamWriter
                    Try
                        fw = New StreamWriter("Log/" & ProductTable.Rows(i).Item("ProductId") & ".log", True, System.Text.Encoding.GetEncoding("gb2312"))
                        fw.WriteLine("商品ID:" & theProduct.GetDetails(ProductTable.Rows(i).Item("ProductId")).ProductId & ";类目名称:" & theProduct.GetDetails(ProductTable.Rows(i).Item("ProductId")).ProductName & ";详细内容:" & ex.ToString)
                        fw.Close()
                    Catch exnext As Exception                    End Try                End Try                Dim fileInfoStart As FileInfo = New FileInfo("StartId.txt")
                fileInfoStart.Delete()
                Dim fwStart As StreamWriter
                fwStart = New StreamWriter("StartId.txt", True)
                fwStart.WriteLine(i)
                fwStart.Close()
            Next

解决方案 »

  1.   

    及时调用  img.Dispose() 方法
      

  2.   

    你看到了我已经及时调用ms.Close()
                        img.Dispose()
      

  3.   

    刚学习.net,说的不一定对。我看了一下,是不是有两个地方值得改进
    1.Dim ms As MemoryStream = New MemoryStream(imagedata)的地方,imagedata指针只向的内存如何释放?ms.close可以吗?
    2.img = img.GetThumbnailImage(aimWidth, aimHeight, Nothing, (New IntPtr).Zero),这个赋值语句把原来的img指向图片给丢掉了。可以这样写dim imgthumb as Image = img.GetThumbnailImage(aimWidth, aimHeight, Nothing, (New IntPtr).Zero) ; img.dispose
      

  4.   

    chongchong2008(天好蓝) 
    能说的更清楚一点吗 ?
      

  5.   

    看到這個我想到調用Excel,在當前運行的程序段內的物件即使是dispose了﹐也不能立即清除內存。
    試試將
    Dim imagedata As Byte(), streamImage As Stream
                        imagedata = theProduct.GetDetails(ProductTable.Rows(i).Item("ProductId")).ProductPicture
                        Dim ms As MemoryStream = New MemoryStream(imagedata)
                        Dim img As Image = Image.FromStream(ms)
                        Dim imgPath As String = "ProductImage/"
                        If Not Directory.Exists(imgPath) Then
                            Dim imgDirectory As DirectoryInfo = Directory.CreateDirectory(imgPath)
                        End If
                        Dim iWidth As Integer = img.Width
                        Dim iHeight As Integer = img.Height
                        Dim aimWidth = 75
                        Dim aimHeight = (aimWidth / iWidth) * iHeight
                        img = img.GetThumbnailImage(aimWidth, aimHeight, Nothing, (New IntPtr).Zero)
                        img.Save(imgPath & ProductTable.Rows(i).Item("ProductId") & ".jpg")
                        ms.Close()
                        img.Dispose()
    放到別一個function中,返回一個路徑就可以了.
    然后在原sub中用System.GC.Collect()強制清除內存.
      

  6.   

    sqfeiyu(流星雨) 
    我按照你说的方式进行了操作,但是我的循环也就停止了
    程序不再继续工作了