none
帮忙看下这个方法是否回收了所有资源 RRS feed

  • 问题

  • public static ImageSource GetImageThumbnail(byte[] ImageStream) { ImageSource source = null; using (MemoryStream mso = new MemoryStream(ImageStream)) { using (System.Drawing.Image drawingImage = System.Drawing.Image.FromStream(mso)) { using (System.Drawing.Image thumbImage = drawingImage.GetThumbnailImage(120, 120, () => { return true; }, IntPtr.Zero)) { using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(thumbImage)) { source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } } } } return source; }

    以上是一个从图片字节流获取该图片ImageSource类型的缩略图的方法

    测试之后发现非托管内存占用越来越大,无法回收。

    请大家帮忙看看是哪个地方没有释放。


    --!

    2012年11月5日 8:27

答案

  • 看起来像是对 HBITMAP 的句柄没有回收。因为没调用一次 GetThumbnailImage 都会产生一个新的 HBITMAP (也就是一个位图句柄)。有两种方法,一是在类型的 Dispose 方法中直接把 HBITMAP 给 Close 掉 (CloseHandle P/Invoke),另外一种方法是缓存相同的图形的缩略图。


    Mark Zhou

    • 已标记为答案 Bunliney 2012年11月6日 1:41
    2012年11月5日 9:39
  • 的确,我最后也找到了。

    最后用

            [DllImport("gdi32")]
            static extern int DeleteObject(IntPtr o);

    释放HBITMAP的句柄后就好了。

    谢谢你的回复。


    --!

    2012年11月6日 1:41

全部回复

  • 看起来像是对 HBITMAP 的句柄没有回收。因为没调用一次 GetThumbnailImage 都会产生一个新的 HBITMAP (也就是一个位图句柄)。有两种方法,一是在类型的 Dispose 方法中直接把 HBITMAP 给 Close 掉 (CloseHandle P/Invoke),另外一种方法是缓存相同的图形的缩略图。


    Mark Zhou

    • 已标记为答案 Bunliney 2012年11月6日 1:41
    2012年11月5日 9:39
  • 的确,我最后也找到了。

    最后用

            [DllImport("gdi32")]
            static extern int DeleteObject(IntPtr o);

    释放HBITMAP的句柄后就好了。

    谢谢你的回复。


    --!

    2012年11月6日 1:41