Как быстро загрузить приложение winforms

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

Я установил startupdate и endupdate. Форма не отображается в фоновом рабочем потоке, потому что это основная форма. Там нет начальных форм. Когда пользователь щелкает значок приложения, это первая загружаемая форма. Добавление индикатора выполнения или любой формы всплеска не является хорошей идеей для меня.

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

Если есть какие-то примеры / идеи, которые вы имеете в виду, было бы мило с вашей стороны, если бы вы могли поделиться ими со мной.

Спасибо и С уважением, Гаган Джанджуа

5 ответов

Решение

Несколько предложений:

  • Постарайтесь свести к минимуму сложность вашего интерфейса. Ваши пользователи будут вам благодарны, и у вас будет меньше элементов управления для загрузки. Например, если у вас есть 3 или 4 элемента управления, которые используются не часто, можете ли вы переместить их в диалоговое окно или развернутый "расширенный" раздел формы, чтобы вы могли отложить их создание / показ? Все ли элементы управления нужны? В самом деле? Подумайте о рабочем процессе, которого вы пытаетесь достичь. Является ли текущий набор элементов управления самым простым способом достижения рабочего процесса? Нужно ли показывать все элементы управления одновременно? Возможно, вы могли бы разместить их на отдельных вкладках в элементе управления вкладками (и, таким образом, только фактически создадите элементы управления, как показано на вкладке)?

  • Можете ли вы уменьшить диапазон используемых типов управления? Каждый новый тип управления может привести к тому, что ваша программа загрузит новую dll для ее поддержки. Каждая DLL, которая должна быть инициализирована, вызывает дополнительное время запуска.

  • Используете ли вы какие-либо элементы управления, которые запускаются медленно? Простое текстовое поле будет быстрым, но сложное графическое управление может быть медленным.

  • Сколько сборок (ваших) загружено? Объедините весь код в одну сборку (например, с ILMerge), и время загрузки, вероятно, значительно улучшится.

  • Удалите любой код инициализации, который не нужен. Можете ли вы упростить инициализацию? Может ли любая инициализация быть отложена (например, создавать только некоторые переменные-члены, когда пользователь нажимает на первую кнопку, которой действительно нужны эти данные, не пытайтесь создать соединение с базой данных, если она еще не нужна, и т. Д.)

  • Можете ли вы отложить создание (некоторые из) пользовательского интерфейса? Например, вы можете поместить группу элементов управления в отдельную форму UserControl, а затем добавить эту форму программным способом в свою MainForm вскоре после запуска (например, на таймере). Это позволит вашей MainForm появляться очень быстро, а затем вскоре "заполняться" дополнительными элементами управления, которые могут не улучшить фактическое время запуска, но будут "чувствовать" намного быстрее и быстрее реагировать на запуск. (Этот подход также может быть чрезвычайно эффективным, если ваши MainForm прокручиваются и эти дополнительные элементы управления изначально не отображаются на экране, так как их нужно создавать, только если пользователь прокручивает их вниз достаточно, чтобы увидеть их)

  • Отображаете ли вы какую-либо информацию, которая может загружаться медленно (например, большие растровые изображения или данные, полученные с сервера SQL)? Вы можете отложить их загрузку или запустить как фоновый поток? Использовать сжатие для ускорения загрузки? Уменьшить их разрешение, чтобы минимизировать объем данных, которые должны быть загружены? Предварительно обработать данные и сохранить их в кеше быстрого запуска при следующем запуске программы?

  • Можно ли заменить некоторые элементы управления оптимизированным подходом? Например, вы можете создать "панель кнопок" в виде набора из 10 отдельных элементов управления или в виде одного элемента управления, который рисует сам себя с появлением 10 кнопок. Проще инициализировать и перерисовать один элемент управления быстрее, чем 10 отдельных элементов управления.

И, конечно же, однажды был собран самый очевидный низко висящий фрукт (или даже раньше):

  • Запустите программу под профилировщиком и посмотрите, где она проводит время.

Попробуйте свести к минимуму код, который выполняется во время on load основной формы или любого элемента управления, который помещен в основную форму.

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

Вам нужны все элементы управления сразу? Если нет, возможно, вы могли бы загрузить их программно после некоторых событий, которые позволяют вам знать, что вам нужен этот элемент управления.

Когда форма загружается, она инициализирует все свои элементы управления.
Сама форма не займет у вас много времени... Это ваши средства управления.

Перейдите к элементам управления и проверьте, что можно улучшить в их конструкторах и инициализаторах.

  • Если у вас есть несколько элементов управления для родительского элемента управления, вызовите метод SuspendLayout перед инициализацией добавляемых элементов управления.
  • После добавления элементов управления в родительский элемент управления вызовите метод ResumeLayout. Это повысит производительность приложений с большим количеством элементов управления.

Например:

      private void LoadData()
{
   // Suspend the form layout and load the data
   this.SuspendLayout();
   LoadMyData();   // logic to load your data will be here
   this.ResumeLayout();
}

ОБЪЯСНЕНИЕ:

  1. SuspendLayout() — останавливает обновление объекта макета, и поэтому компонент не тратит время на вычисления для перерисовки, пока макет не будет возобновлен.
  2. ResumeLayout() — пересчитывает макет один раз после внесения всех ваших изменений, что приводит к повышению производительности.

Зачем использовать SuspendLayout() и ResumeLayout()

  1. Это предотвращает аварии макета, когда элементы управления имеют свойства макета, которые влияют друг на друга.
  2. Он настраивает несколько свойств, связанных с макетом, таких как Dock, Auto-Size и т. Д.
Другие вопросы по тегам