Параллельная загрузка данных с помощью winforms - PullRequest
0 голосов
/ 15 марта 2012

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

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

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

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

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

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

1 Ответ

0 голосов
/ 15 марта 2012

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

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

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

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

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

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