GDI-Handle Leak

本文关键字:Leak GDI-Handle | 更新日期: 2023-09-27 18:18:20

我遇到了GDI-Handle ' s的问题。我理解windows限制每个应用程序的gdi句柄数量为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应用程序的行为如此不同?任何想法我怎么能调试它没有安装在系统上的visual studio ?

GDI-Handle Leak

我解决了这个问题。在系统上,我得到了错误,我运行工具"GDIView"。有了这个工具,我能够确定导致问题的对象是位图。我发现位图引起了麻烦,并发现我必须手动处理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()"方法,泄漏就消失了。