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

为什么在WinForms中使用ErrorProvider时CPU使用率高?,winforms,performance,errorprovider,Winforms,Performance,Errorprovider,我有一个应用程序,随着时间的推移,当ErrorProvider控件在几个控件上连续设置闪烁图标时,CPU使用率会慢慢上升 CPU的高使用率不是即时的,而是缓慢的上升,直到应用程序达到100%的CPU 当没有显示错误时,CPU将恢复正常。ErrorProvider占用这么多CPU时间是正常的吗?这不正常。很可能是内存或窗口句柄泄漏。使用Taskmgr.exe的“进程”选项卡开始诊断此问题。查看+选择列并勾选内存提交大小、句柄、用户对象和GDI对象。在应用程序运行时观察这些列的值 不断增加的值表示代

我有一个应用程序,随着时间的推移,当ErrorProvider控件在几个控件上连续设置闪烁图标时,CPU使用率会慢慢上升

CPU的高使用率不是即时的,而是缓慢的上升,直到应用程序达到100%的CPU


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

这不正常。很可能是内存或窗口句柄泄漏。使用Taskmgr.exe的“进程”选项卡开始诊断此问题。查看+选择列并勾选内存提交大小、句柄、用户对象和GDI对象。在应用程序运行时观察这些列的值


不断增加的值表示代码中存在问题,可能会导致cpu使用率上升。一个非常典型的问题是泄漏用户句柄,这是由使用控件从窗体中删除控件引起的。删除或删除控件。清除并忘记处理这些控件。

这是不正常的。很可能是内存或窗口句柄泄漏。使用Taskmgr.exe的“进程”选项卡开始诊断此问题。查看+选择列并勾选内存提交大小、句柄、用户对象和GDI对象。在应用程序运行时观察这些列的值


不断增加的值表示代码中存在问题,可能会导致cpu使用率上升。一个非常典型的问题是泄漏用户句柄,这是由使用控件从窗体中删除控件引起的。删除或删除控件。清除并忘记处理这些控件。

根据此MS connect错误报告:

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

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


此错误被标记为已修复,但最近的评论说它正在调查中。

根据此MS connect错误报告:

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

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


此错误被标记为已修复,但最近的评论说它正在调查中。

正如Hans所说,内存泄漏似乎最有可能。您是每次都创建一个新的ErrorProvider控件,还是重复使用一个现有控件?@Cody我重复使用同一个。似乎是因为一直在眨眼……我想这就是为什么我从未见过它的原因。我做的第一件事就是关掉那讨厌的眨眼。我不知道为什么它必须是默认值;错误指示器很容易看出它是否静止不动。正如Hans所建议的,内存泄漏似乎是最有可能的。您是每次都创建一个新的ErrorProvider控件,还是重复使用一个现有控件?@Cody我重复使用同一个。似乎是因为一直在眨眼……我想这就是为什么我从未见过它的原因。我做的第一件事就是关掉那讨厌的眨眼。我不知道为什么它必须是默认值;错误指示器很容易看到它是否静止。好吧,它很奇怪,内存、句柄等等都没有增加!我唯一能想到的另一种情况是错误地获得事件订阅,一次又一次地注册同一个处理程序。然后,一个事件可以生成对同一方法的大量调用。您最终需要调试它,以找出所有周期的去向。工具+附加到进程以附加调试器。分析器也会很方便。看来问题不在我的代码中,因为如果我将控件设置为不闪烁,那么就没有问题了。只有当我设置连续闪烁时。看起来像MS代码中的错误!我根本无法得到任何修改,即使是用自定义图标以荒谬的速度闪烁。没有责备我帮不了你。不眨眼的声音
ike是一个不错的解决方案。好吧,这很奇怪,内存、句柄等等都没有增加!我唯一能想到的另一种情况是错误地获得事件订阅,一次又一次地注册同一个处理程序。然后,一个事件可以生成对同一方法的大量调用。您最终需要调试它,以找出所有周期的去向。工具+附加到进程以附加调试器。分析器也会很方便。看来问题不在我的代码中,因为如果我将控件设置为不闪烁,那么就没有问题了。只有当我设置连续闪烁时。看起来像MS代码中的错误!我根本无法得到任何修改,即使是用自定义图标以荒谬的速度闪烁。没有责备我帮不了你。不眨眼听起来是个不错的解决办法。