C# FormHbitmap OutofMemoryException(内存溢出)解决方案

来源:互联网 发布:mac上迅雷下载不了 编辑:程序博客网 时间:2024/05/17 08:51

最近写了一个基于图象识别的监控软件。


先贴截图部分代码:

public Bitmap getPicture(Rectangle nrect)        {            IntPtr hscrdc = Win32API.GetWindowDC(WXConstants.HANDLE_MAIN_FORM_WINDOW);            DllOperationDelegations.RECT rect;            Win32API.GetWindowRect(WXConstants.HANDLE_MAIN_FORM_WINDOW, out rect);            IntPtr hbitmap = Win32API.CreateCompatibleBitmap(hscrdc, (int)(rect.Right + 10 - rect.Left), (int)(rect.Bottom + 10 - rect.Top));            IntPtr hmemdc = Win32API.CreateCompatibleDC(hscrdc);            Win32API.SelectObject(hmemdc, hbitmap);            Win32API.PrintWindow(WXConstants.HANDLE_MAIN_FORM_WINDOW, hmemdc, 0);            Bitmap bmp;            bmp = Bitmap.FromHbitmap(hbitmap);            Win32API.DeleteDC(hscrdc);            Win32API.DeleteDC(hmemdc);            Win32API.DeleteObject(hbitmap);            Bitmap b = new Bitmap(nrect.Width, nrect.Height, PixelFormat.Format32bppArgb);            Graphics g = Graphics.FromImage(b);            g.DrawImage(bmp, 0, 0, nrect, GraphicsUnit.Pixel);                        g.Dispose();            return b;        }

技术很渣,也没测内存,结果在用户那边一跑,几十分钟就抛内存溢出,汗死委屈

网上查了查,包括微软官网,都推荐用GDIDeleteObject()方法,不过释放与不释放,差别不是很明显,虽然性能提升50%。不过内存曲线还是快速攀升。


最后终于查到,截图之后,可以内存强制释放一次

GC.Collect();
内存溢出就解决了。CPU消耗也不是很高。


感觉这不是最好的方法,若有高人,请指点~~~~

0 0
原创粉丝点击