Так что моя проблема в этом. У меня есть форма с панелью. Эта панель служит контейнером для множества различных пользовательских элементов управления, из которых одновременно отображается только один. Некоторые из указанных usercontrols отображают большое количество данных из БД, поэтому загрузка их занимает немного времени (данные показаны в привязке datagridview). Я попытался создать метод LoadData для этих элементов управления, который затем запускаю в отдельных потоках, и как только они выполнили свою работу, они активируют фактические кнопки в основной форме для их отображения.Одновременная загрузка данных с помощью winforms
Были, однако, много разных проблем. Во-первых, я не могу вызывать this.Invoke на usercontrol, пока его дескриптор не создается, что кажется довольно трудно заставить, особенно если я хочу показать заставку во время инициализации (дескриптор основной формы еще не создан).
Мне удалось заставить это установить форму. Видимый = истинный, а затем вызывающий form.CreateControl, за которым следует form.visible = false. Это, однако, показывает форму, мигающую на экране, которая не выглядит красивой.
Я также попытался не использовать Invoke, если дескриптор еще не создан, но это подводит меня к проблеме создания моего объекта данных в другом потоке, а затем недоступно для «нормального» потока элемента управления.
Так как это, вероятно, совершенно очевидно, я теряюсь, когда дело доходит до многопоточности, особенно с winforms и, тем более, при запуске приложения. Мое объяснение также может быть довольно запутанным, но я попробую и уточню, если это необходимо.
Итак, каков правильный способ сделать это?
Если ваш пользователь не может взаимодействовать с вашей программой во время загрузки данных, разве это не бессмысленно перемещать загрузку данных внутри потока? – Steve
Элементы управления с меньшим количеством данных загружаются во время всплеска и доступны сразу. – bobblez