Загрузка формы Windows с более чем 200 элементами управления - PullRequest
0 голосов
/ 08 сентября 2010

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

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

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

Ответы [ 6 ]

8 голосов
/ 08 сентября 2010

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

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

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

6 голосов
/ 08 сентября 2010

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

За MSDN :

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

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

4 голосов
/ 08 сентября 2010

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

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

1 голос
/ 08 сентября 2010

Вещи, которые другие не упоминали:

  • Снимите опцию [DebuggerStepThru] с InitializeComponent, после чего вы сможете увидеть, какие элементы берут дольше легче (с профилировщиком или просто случайным образом нажимают «паузу» в IDE во время загрузки 20x и запоминают, где она больше всего останавливается).
  • Конвертируйте в WPF, если ваш босс разрешит вам.
  • Возьмите элементы InitializeComponent из формы, из компонента инициализации и в буфер обмена. Добавьте таймер с тиками 20MS. На галочку увеличьте счетчик. Добавьте один элемент управления на тик, разделив ваш код initializecomponent на оператор выбора из 200 случаев. На 201 остановите таймер. Таким образом, пользователь может начать работать до того, как будут добавлены все элементы управления. Вам нужно будет переставить control.add, чтобы они появились. Сначала вам нужно будет показать важные элементы управления. Вы не сможете изменить свою форму в конструкторе. Прошлое, мне жаль Фу, который думает, что этот пункт - не шутка.
0 голосов
/ 08 сентября 2010

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

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

0 голосов
/ 08 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...