1

我遇到了 GDI-Handle 的问题。我了解 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 应用程序的另一台 PC 上的行为如此不同?知道如何在系统上不安装 Visual Studio 的情况下调试它吗?

4

1 回答 1

1

我解决了这个问题。在系统上,我遇到了运行工具“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()”方法,泄漏就消失了。

于 2013-06-14T13:28:10.053 回答