2010-09-08 1 views
-1

Моя форма имеет более 200 элементов управления! Для загрузки формы и привязки элементов управления требуется около 7 секунд.Загрузка формы Windows с более чем 200 элементами управления

Я проследил приложение с некоторыми профайлерами производительности, но я не нашел ничего с флагом HOT, кроме формы конструктора.

Я хотел бы знать, что это можно назвать InitializeComponent метод с sth like backgroundWorker (многопоточность)!?

+17

Если у вас есть форма с более чем 200 элементами управления, вы делаете это неправильно. –

+3

Как сделать 200+ элементов управления на одном дисплее? – BoltClock

+3

Я сомневаюсь, что у вас есть Пользователь, который может контролировать 200 элементов управления. У обычного пользователя возникают проблемы с 10. –

ответ

8

Нет, резьба не поможет. Элементы управления необходимо создать в потоке пользовательского интерфейса, чтобы приложение могло работать вообще.

Единственным разумным способом было бы выяснить, действительно ли вам нужно создать все 200 элементов управления при создании формы или если вы можете загрузить их «по требованию».

Без знания вашего приложения невозможно дать более конкретные рекомендации, но, возможно, у вас есть ситуация, когда не все элементы управления используются одновременно, а скорее есть какой-то пейджинг. Если это так, каждая «страница», возможно, может быть внесена в пользовательский элемент управления, чтобы вы могли загружать и выгружать страницы по мере необходимости.

4

Производительность - не единственная проблема. Существуют ограничения ОС на количество дескрипторов, которыми может владеть процесс, и есть ограничения на вложенный макет управления, который будет выполнять WinForms. Если у вас есть 200+ элементов управления Windows Forms в одном окне, я уверен, что вы столкнетесь с этими и другими ограничениями.

Я рекомендую изменить форму, чтобы было меньше элементов управления: пейджинг, виртуализация, ленивая загрузка - это некоторые методы, которые вы можете использовать для улучшения вашего пользовательского интерфейса и производительности.

6

Лучшей идеей было бы разделить ваш пользовательский интерфейс с помощью TabControl. Он отложенная загрузка построен в

Per MSDN:.

управление, содержащемся в TabPage не создается, пока закладка не отображаются, и любые привязок данных в этих элементах управления не активируется только на закладке Показано.

И этот дизайн напрямую направлен на вашу проблему.

+0

Это действительно ленивая загрузка? Я сомневаюсь ... но я не знаю, лучше проверить сейчас. – Aliostad

+1

С 10 элементами управления на вкладку, это 20 вкладок. – BoltClock

+1

@BoltClock, с TabControls на вкладках проблема быстро падает. Это проблема O (log n). –

0

Я считаю NGen -приложение вашего приложения может помочь в производительности. Большинство из этих элементов управления (некоторые из них, возможно, пользовательские в вашем приложении) должны быть адаптированы к NGen-ed, и это обычно занимает много времени, так как возврат к одной и той же форме всегда намного быстрее.

+0

Я не пробовал, но на 7 секунд больше пахнет проблемой привязки данных (базы), чем задержка JIT. –

+0

Ну, похоже, это формы окон, а не WPF, поэтому не уверен, что он использует привязку данных. – Aliostad

0

Хотя я мог бы согласиться с Иудой, я видел множество форм в приложении MDI WinForms, которое превысило 200 полных элементов управления, логически содержащихся в форме, и форма нужна каждому из них для выполнения своей работы. Окно ввода счета-фактуры, например, будет иметь набор элементов управления для заголовка, а затем набор пользовательских элементов управления, каждый из которых сопоставляется с линией счета-фактуры, и имеет поля для SKU, описание, количество, цену за единицу, расширенную цену, налог на единицу и т. Д. Такой контроль окна зависит от количества строк счета, а большой заказ может генерировать счет-фактуру, требующую привязки и отображения тысяч элементов управления на одном экране, если это делается наивно. Добавьте дополнительные сведения о каждой строке для инструкций по отправке, налоговой информации, состояния резерва и т. Д., А также для предварительной загрузки и отображения каждого элемента управления при загрузке окна приведет к сбою приложения.

7 секунд кажется чрезмерным, хотя. Я согласен с Фредериком; первый шаг - посмотреть и посмотреть, нужно ли отображать все 200 элементов управления, чтобы показать ценность одного экрана. Использование элементов управления вкладками с обработчиками событий для изменений вкладок, которые «ленивая загрузка» информации и элементов управления, показанных на каждой вкладке, является хорошим первым шагом. Если вы показываете строки повторяющейся дочерней информации (например, строки счетов в счете-фактуре), вы можете сэкономить время, загружая конечную страницу информации за раз; загрузка 10 строк намного дешевле, чем загрузка 100, и, хотя есть некоторые накладные расходы при разговоре с БД и динамическая загрузка элементов управления, которые будут повторяться чаще, таким образом, это будет выглядеть тривиально по сравнению с ожиданием нескольких секунд, чтобы увидеть НИЧЕГО нагрузку на окно.

1

вещи, чтобы попробовать, что другие не упоминали:

  • Возьмите опцию [DebuggerStepThru] прочь InitializeComponent, то вы можете увидеть, какие элементы длиной более легко (ж/профайлер или просто случайно попав ' пауза "в IDE во время загрузки 20x и помнить, где он больше всего останавливается).
  • Конвертировать в WPF, если ваш босс позволит вам.
  • Возьмите формы объектов InitializeComponent, из исходных компонентов и в буфер обмена. Добавьте таймер с титами 20MS. На галочке увеличьте счетчик. Добавьте один элемент управления для каждого тика, разделив ваш initializcomomponent код на 200-case select statement. На 201 остановите таймер. Таким образом, пользователь может начать работу до того, как все элементы управления будут добавлены. Вам придется перестроить controls.add, чтобы они отображались. Сначала вам нужно будет отобразить важные элементы управления. Вы не сможете изменить свою форму в дизайнере. В конце концов, я жалею, что кто-то думает, что этот пункт является чем-то вроде шутки.

 Смежные вопросы

  • Нет связанных вопросов^_^