где лучше всего выполнить инициализацию в winform?

В событии Load или в конструкторе после InitializeComponent ()?

или вообще не имеет значения?


person Benny    schedule 15.01.2010    source источник
comment
Возможный дубликат Конструктор форм Winforms против события загрузки   -  person Jim Fell    schedule 07.07.2016


Ответы (6)


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

Очевидно, что если у вас длительная инициализация, вам все равно нужно предоставить какую-то визуальную обратную связь и, возможно, отключить разделы формы до завершения. Но если инициализация неизбежна, Form.Shown, по крайней мере, позволяет вам сообщить пользователю, что приложение не зависло, и дать обратную связь о том, что оно на самом деле делает.

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

По сравнению с Form.Activated: вам не нужно беспокоиться о том, что инициализация будет выполняться несколько раз, потому что событие Activated вызывается каждый раз, когда ваша форма скрывается / отображается, минимизируется / развертывается и т. Д.

По сравнению с конструктором: аналогично Form.Load ваша форма не будет видна до завершения инициализации. Кроме того, вы должны быть более осторожны с проблемами времени / последовательности, связанными с элементами управления, которые могут быть не полностью инициализированы.

person Ash    schedule 15.01.2010
comment
Я попытался использовать событие Shown и обнаружил, что оно не работает так, как вы описываете: метод запускается снова каждый раз, когда отображается диалоговое окно. В результате, если я использую его для заполнения списка, то в итоге элементы будут повторяться каждый раз, когда отображается диалоговое окно. Я смущен.... - person Stewart; 07.03.2017

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

person Paul Sasik    schedule 15.01.2010

Более тяжелая инициализация также может быть не очень хорошей идеей при загрузке, поскольку она может увеличить время загрузки и может раздражать конечного пользователя. Я предпочитаю выполнять базовую инициализацию (скажем… которая занимает ‹10 секунд) в Form Load и выполнять остальную тяжелую работу после того, как она отображается пользователю. Чтобы заставить пользователя ждать, может отображаться индикатор выполнения.

person geekonweb    schedule 15.01.2010

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

Однако в некоторых случаях у конструктора нет нужной информации. Например, если вы хотите делать разные вещи в зависимости от того, находитесь ли вы в режиме разработки или в режиме выполнения (например, в режиме выполнения вы подключаетесь к источнику данных, но в режиме разработки вы хотите отображать образцы данных), тогда это должно должен быть отложен до завершения построения, потому что структура не устанавливает режим DesignMode до тех пор, пока объект не будет построен.

person itowlson    schedule 15.01.2010
comment
На самом деле неправда. Вы можете проверить LicenseManager.UsageMode в конструкторе (и только в конструкторе), чтобы проверить, находитесь ли вы в режиме разработки. - person Eric; 15.01.2010

Выполнение чего-либо в событии Load сделает исключения, когда он не работает, немного легче читается, а IMHO семантически чище. Практически это не имеет большого значения.

person Ana Betts    schedule 15.01.2010

Подумайте, что произойдет, если вы дважды запустите Show или ShowDialog для одной и той же формы. Все, что не может измениться между этими двумя вызовами, должно быть в конструкторе; весь код инициализации, зависящий от соответствующего вызова Show (Dialog), должен находиться в обработчике событий, который будет вызываться для каждого из этих вызовов. Например, владелец формы передается в ShowDialog, а не в конструкторе, и может быть различным для двух разных вызовов ShowDialog, поэтому все, что зависит от владельца, не должно быть в конструкторе.

person Doc Brown    schedule 15.01.2010