2012-03-15 6 views
0

Так что моя проблема в этом. У меня есть форма с панелью. Эта панель служит контейнером для множества различных пользовательских элементов управления, из которых одновременно отображается только один. Некоторые из указанных usercontrols отображают большое количество данных из БД, поэтому загрузка их занимает немного времени (данные показаны в привязке datagridview). Я попытался создать метод LoadData для этих элементов управления, который затем запускаю в отдельных потоках, и как только они выполнили свою работу, они активируют фактические кнопки в основной форме для их отображения.Одновременная загрузка данных с помощью winforms

Были, однако, много разных проблем. Во-первых, я не могу вызывать this.Invoke на usercontrol, пока его дескриптор не создается, что кажется довольно трудно заставить, особенно если я хочу показать заставку во время инициализации (дескриптор основной формы еще не создан).

Мне удалось заставить это установить форму. Видимый = истинный, а затем вызывающий form.CreateControl, за которым следует form.visible = false. Это, однако, показывает форму, мигающую на экране, которая не выглядит красивой.

Я также попытался не использовать Invoke, если дескриптор еще не создан, но это подводит меня к проблеме создания моего объекта данных в другом потоке, а затем недоступно для «нормального» потока элемента управления.

Так как это, вероятно, совершенно очевидно, я теряюсь, когда дело доходит до многопоточности, особенно с winforms и, тем более, при запуске приложения. Мое объяснение также может быть довольно запутанным, но я попробую и уточню, если это необходимо.

Итак, каков правильный способ сделать это?

+0

Если ваш пользователь не может взаимодействовать с вашей программой во время загрузки данных, разве это не бессмысленно перемещать загрузку данных внутри потока? – Steve

+0

Элементы управления с меньшим количеством данных загружаются во время всплеска и доступны сразу. – bobblez

ответ

0

Трудно определить, с чего начать.

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

Если бы я сказал шесть кнопок и одну панель, и кнопки перевернули панель управления пользователя на панель, чтобы увидеть ее, My thread вернет пользовательский элемент управления, который я бы добавил в панель, а затем включил его связанную кнопку.

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

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

+0

Это более ретро-мультяшная проблема -kinda. И да, описание функциональности элементов управления и панели довольно точно. И это звучит как хорошее решение, но как именно вы можете заставить поток вернуть что-то? Я даже не знал, что такое возможно. – bobblez

+0

Google Thread.Start или передача данных в потоки –

+0

Ну да, это то, что я использую, но это передача данных в поток, а не поток, возвращающий его. Но, о, хорошо, думаю, мне удастся это выяснить. – bobblez

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