Почему высокая загрузка ЦП при использовании ErrorProvider в WinForms? - PullRequest
1 голос
/ 31 марта 2011

У меня есть приложение, которое загружается с высокой загрузкой ЦП (медленно с течением времени), когда элемент управления ErrorProvider постоянно устанавливает мигающий значок на нескольких элементах управления.

Высокая загрузка ЦП не является немедленной, но имеет медленныйНарастать до тех пор, пока приложение не достигнет 100% ЦП.

Если ошибки не отображаются, ЦП возвращается в нормальное состояние.Это нормально, что ErrorProvider занимает так много процессорного времени?

Ответы [ 2 ]

3 голосов
/ 31 марта 2011

Это не нормально. По всей вероятности, у вас течет память или оконные ручки. Начните диагностировать это с помощью Taskmgr.exe, вкладка «Процессы». View + Select Columns и отметьте Memory (фиксация размера), Handles, объекты USER и объекты GDI. Следите за значениями этих столбцов во время работы приложения.

Постоянно увеличивающиеся значения указывают на проблему в вашем коде, которая может увеличить использование процессора. Довольно классическая проблема - утечка дескрипторов USER, вызванная удалением элементов управления из формы с помощью Controls.Remove () или Controls.Clear () и забыванием утилизировать эти элементы управления.

2 голосов
/ 11 января 2012

Согласно отчету об ошибке подключения MS: Утечка графических ресурсов в ErrorProvider

При возникновении ошибки, связанной с элементом управления, компонент ErrorProvider отображает мигающий значок на своемправо.Я обнаружил, что каждый раз, когда значок мигает, новый DeviceContext добавляется во внутренний список System.Drawing.Internal.DeviceContexts.И когда я вызываю метод Dispose () для объекта ErrorProvider, список DeviceContexts не очищается.

Следствие: по умолчанию значок мигает каждые 250 мс, поэтому 4 объекта DeviceContext добавляются в System.Drawing.Internal.DeviceContexts список в секунду.Когда ErrorProvider активен, а BlinkStyle - AlwaysBlink, список увеличивается бесконечно ... и когда этот список очень большой (я видел его с 500 000+ объектами!), Операции рисования приложения очень, очень очень медленные: (

Эта ошибка помечена как исправленная, но в последнем комментарии говорится, что она расследуется.

...