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

发布于 2024-10-28 19:14:32 字数 182 浏览 3 评论 0原文

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

高 CPU 使用率不会立即出现,而是会缓慢上升,直到应用程序达到 100% CPU。

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

I've got an application that goes into high CPU usage (slowly over time) when the ErrorProvider control sets the blinking icon continuously on several controls.

The high CPU usage is not immediate but have a slow ramp until the application hits 100% CPU.

When there is no error shown then CPU goes back to normal. Is it normal that the ErrorProvider takes so much CPU time?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

彡翼 2024-11-04 19:14:32

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

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

This isn't normal. In all likelihood you are leaking memory or window handles. Start diagnosing this with Taskmgr.exe, Processes tab. View + Select Columns and tick Memory (Commit size), Handles, USER objects and GDI objects. Observe the values of these columns while your app runs.

Steadily increasing values indicates a problem in your code that can drive up the cpu usage. A pretty classic problem is leaking USER handles, induced by removing controls from your form with Controls.Remove() or Controls.Clear() and forgetting to dispose those controls.

泪冰清 2024-11-04 19:14:32

根据此 MS connect 错误报告: 图形资源ErrorProvider 泄漏

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

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

这个 bug已标记为已修复,但最新评论表示正在调查中。

According to this MS connect bug report: Graphical Resources Leak In ErrorProvider

When there is an error associated with a control, the ErrorProvider component displays a blinking icon on its right. I've discovered that every time the icon blinks, an new DeviceContext is added to the System.Drawing.Internal.DeviceContexts internal list. And when I call the Dispose() method on the ErrorProvider object, the DeviceContexts list is not cleared.

Consequence : by default, the icon blinks every 250 ms so 4 DeviceContext objects are added to the System.Drawing.Internal.DeviceContexts list per second. When an ErrorProvider is active and the BlinkStyle is AlwaysBlink, the list grows indefinitely ... and when this list is very big (I've seen it with 500000+ objects!) the application drawing operations are very very very slow :(

This bug is marked as fixed but the most recent comment says it is under investigation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文