当 ErrorProvider 控件在多个控件上连续设置闪烁图标时,我有一个应用程序进入高 CPU 使用率(随着时间的推移缓慢)。
高 CPU 使用率不是立即的,而是会缓慢上升,直到应用程序达到 100% CPU。
当没有显示错误时,CPU 恢复正常。ErrorProvider 占用这么多 CPU 时间是否正常?
当 ErrorProvider 控件在多个控件上连续设置闪烁图标时,我有一个应用程序进入高 CPU 使用率(随着时间的推移缓慢)。
高 CPU 使用率不是立即的,而是会缓慢上升,直到应用程序达到 100% CPU。
当没有显示错误时,CPU 恢复正常。ErrorProvider 占用这么多 CPU 时间是否正常?
这不正常。您很可能正在泄漏内存或窗口句柄。使用 Taskmgr.exe 的“进程”选项卡开始对此进行诊断。查看 + 选择列并勾选内存(提交大小)、句柄、用户对象和 GDI 对象。在您的应用运行时观察这些列的值。
稳步增加的值表明您的代码中存在可能提高 CPU 使用率的问题。一个非常经典的问题是泄漏 USER 句柄,这是通过使用 Controls.Remove() 或 Controls.Clear() 从表单中删除控件并忘记处置这些控件而引起的。
根据这个 MS 连接错误报告:ErrorProvider 中的图形资源泄漏
当存在与控件相关的错误时,ErrorProvider 组件会在其右侧显示一个闪烁的图标。我发现每次图标闪烁时,都会将一个新的 DeviceContext 添加到 System.Drawing.Internal.DeviceContexts 内部列表中。当我在 ErrorProvider 对象上调用 Dispose() 方法时,不会清除 DeviceContexts 列表。
结果:默认情况下,图标每 250 毫秒闪烁一次,因此每秒将 4 个 DeviceContext 对象添加到 System.Drawing.Internal.DeviceContexts 列表中。当 ErrorProvider 处于活动状态并且 BlinkStyle 为 AlwaysBlink 时,列表会无限增长......当这个列表非常大(我已经看到它包含 500000 多个对象!)时,应用程序的绘图操作非常非常非常慢:(
这个错误被标记为已修复,但最近的评论说它正在调查中。