【发布时间】:2010-10-27 01:31:45
【问题描述】:
我正在调查大型应用程序中的 GDI 资源泄漏。为了进一步了解这些问题是如何发生的,我创建了一个非常小的应用程序,我故意将其设置为“泄漏”。这是一个简单的用户控件,应该会创建 100 个 Pen 对象:
公共部分类TestControl:UserControl { 私人列表钢笔=新列表(); 公共测试控制() { 初始化组件(); for (int i = 0; i但是,当我创建对象的实例并将其添加到表单时,使用 TaskManager 查看我的应用程序时,我目前看到了大约 37 个 GDI 对象。如果我反复将新的 TestObject 用户控件添加到我的表单中,我仍然只能看到大约 37 个 GDI 对象。
这是怎么回事!我以为 System.Drawing.Pen 的构造函数会使用 GDI+ API 来创建新的 Pen,从而使用新的 GDI 对象。
我一定要疯了。如果我不能编写一个创建 GDI 对象的简单测试应用程序,我该如何创建一个泄漏它们的应用程序!
任何帮助将不胜感激。
最好的问候,科林 E。
【问题讨论】:
-
奇怪的问题,我同意。你有没有验证是否没有。如果您循环 少于 37 次,则 GDI 对象的数量会从 37 减少?
-
是的 - 37 个 GDI 对象似乎与简单测试应用程序本身的开销有关。与上述代码中的循环次数无关。我认为 OregonGhost(下)是关于 GDI+ 不使用 GDI 句柄的东西,我认为它确实使用了!我希望有一些文档可以验证这一点。