今天下午突然接到一个很奇怪的bug,发现在打开Theme的环境下,show OverflowTip时会导致每次1个GDI的泄漏,拿到示例,跟了许久,居然没有发现任何线索,只能通过GDIUsage查到泄漏了相当多的GDI Region,很郁闷,按照新的设计,应该不会有明显的GDI泄漏问题,即使有也可能只是开发时的“手误”,只要打开GDI的Trace工具,肯定就可以发现,结果什么都没有,难道Trace工具也会错?
    只好再查,发现问题只发生在Theme打开的环境,恰好这时看到代码中有一段关于Theme的处理,于是抱着试试的心理,封了这段处理(代码3-11行),意外竟然发现不再有GDI Leak了,显然就是这里有鬼了。

 1[Bug] VisualStyleRenderer may cause GDI leak!public override Region CreateRegion()
 2}
    但是这里很简单,基本上没有什么复杂的,构造了个VisualStyleRenderer,调用GetBackgroundRegion获得一个Region,于是再次把这段代码打开,GDI又泄漏了,嗯,既然外表看来没有问题,那只能去查查他的家底了。
    打开Reflector,找到VisaulStyleRenderer.GetBackgroundRegion,发现这里是通过uxTheme的API——GetThemeBackgroundRegion来获取一个GDI Region Object,然后通过System.Drawing.Region.FromHrgn获得Region并返回;或许你也发现了,这里的GDI Region Object没有释放!就是说就是这个函数导致了GDI泄漏。
 1[Bug] VisualStyleRenderer may cause GDI leak![SuppressUnmanagedCodeSecurity]
 2[Bug] VisualStyleRenderer may cause GDI leak!public Region GetBackgroundRegion(IDeviceContext dc, Rectangle bounds)
 3}
    分析到此,已经可以得出是MS在这里的bug了。为了再次验证,我写了个简单的Demo,当每次点击Button后,就会发现系统资源里多一个GDI Object:
 1[Bug] VisualStyleRenderer may cause GDI leak!public partial class Form1 : Form
 2}

    下面是运行结果截图:
[Bug] VisualStyleRenderer may cause GDI leak!

    OK,到此为止,确定这是MS VisualStyleRenderer导致GDI leak了,面对bug,该怎么解决呢?既然这个接口会导致bug,我们只能提供一个相似功能的函数,来作为短期替代方案,待MS修复bug之后再恢复现在code。
    下面是解决方案:

 1[Bug] VisualStyleRenderer may cause GDI leak!public override Region CreateRegion()
 2}

相关文章:

  • 2022-01-16
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-12
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-09-08
  • 2022-02-14
  • 2022-12-23
  • 2022-12-23
  • 2021-07-25
  • 2021-06-02
相关资源
相似解决方案