在WinForms中使用ErrorProvider时CPU使用率高,为什么?

时间:2011-03-31 13:26:09

标签: winforms performance errorprovider

当ErrorProvider控件在多个控件上连续设置闪烁图标时,我的应用程序会进入高CPU使用率(缓慢的时间)。

高CPU使用率不是立竿见影的,但在应用程序达到100%CPU之前缓慢上升。

如果没有显示错误,则CPU恢复正常。 ErrorProvider占用这么多CPU时间是正常的吗?

2 个答案:

答案 0 :(得分:3)

这不正常。很可能你正在泄漏内存或窗口句柄。使用Taskmgr.exe,Processes选项卡开始诊断。查看+选择列并勾选内存(提交大小),句柄,USER对象和GDI对象。在应用运行时观察这些列的值。

稳定增加的值表示代码中存在可能导致cpu使用率上升的问题。一个非常经典的问题是泄漏USER句柄,这是通过使用Controls.Remove()或Controls.Clear()从表单中删除控件并忘记处理这些控件而引起的。

答案 1 :(得分:2)

根据此MS连接错误报告:Graphical Resources Leak In ErrorProvider

  

当出现与控件关联的错误时,ErrorProvider组件右侧会显示一个闪烁的图标。我发现每次图标闪烁时,都会在System.Drawing.Internal.DeviceContexts内部列表中添加一个新的DeviceContext。当我在ErrorProvider对象上调用Dispose()方法时,不会清除DeviceContexts列表。

     

结果:默认情况下,图标每250毫秒闪烁一次,因此每秒将4个DeviceContext对象添加到System.Drawing.Internal.DeviceContexts列表中。当ErrorProvider处于活动状态且BlinkStyle为AlwaysBlink时,列表无限增长......当此列表非常大时(我已经看到它有500000+个对象!)应用程序绘制操作非常非常慢:(

此错误已标记为已修复,但最新评论表示正在调查中。