GDI-处理泄漏

时间:2013-06-13 16:08:27

标签: c# .net gdi memory-leaks

我遇到了GDI-Handle的问题。我知道windows限制了每个应用程序的GDI-Handles数量为10.000。然后应用程序崩溃。

在我自己的系统和几台虚拟机上,无论我做什么,GDI-Handles的数量都会保持在300到500之间。在客户项目上,它会越来越高,直到几天后达到10.000。

13.06.2013: 12:47 GDI-Handles 1550

13.06.2013: 12:59 GDI-Handles 1553

13.06.2013: 13:07 GDI-Handles 1557

13.06.2013: 13:55 GDI-Handles 1564

13.06.2013: 15:29 GDI-Handles 2193

13.06.2013: 16:47 GDI-Handles 2201

13.06.2013: 17:14 GDI-Handles 2201

13.06.2013: 17:21 GDI-Handles 2201

13.06.2013: 17:29 GDI-Handles 2263

为什么具有完全相同的.NET应用程序的另一台PC上的行为如此不同?如果没有在系统上安装visual studio,我怎么能调试呢?

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。在系统上我得到了错误,我运行了工具“GDIView”。使用此工具,我能够确定导致问题的对象是位图。我发现Bitmap导致了麻烦并且说明我必须手动处理IntPtr(没有来自GC的帮助)。

            ImageSource wpfBitmap = null;

            if (this.buttonImage != null)
            {

                IntPtr hBitmap = this.buttonImage.GetHbitmap();

                wpfBitmap = Imaging.CreateBitmapSourceFromHBitmap(
                   hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());

                DeleteObject(hBitmap);
            }

            return wpfBitmap;

所以我刚刚添加了“DeleteObject()”方法,泄漏就消失了。