Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.02.2017
Сообщений: 4

Как создавать контролы ассинхронно?

02.03.2017, 09:34. Показов 863. Ответов 3

Студворк — интернет-сервис помощи студентам
Вообщем опишу суть проблемы есть у меня метод который создает контролы через код, но при записи в Combobox одной операции это происходит очень долго, от чего форма, как будто зависла. Поэтому нужно вставить gif который будет изображать какую нибудь анимацию загрузки асинхронно, пока идут другие операции
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 public async void ServerInit()
        {
            await Task.Run(() =>
            {
 
                //ServerComboBox
                comboBoxServer.Top = btnCloseUI.Top + 60;
                comboBoxServer.Left = 2;
                comboBoxServer.Width = this.Width - 20;
                comboBoxServer.Items.Clear();
                comboBoxServer.Text = "Выберите доступные сервера";
                System.Data.Sql.SqlDataSourceEnumerator Server_List =
                    System.Data.Sql.SqlDataSourceEnumerator.Instance;
                System.Data.DataTable Server_Table = Server_List.GetDataSources();
                foreach (DataRow row in Server_Table.Rows)
                {
                    comboBoxServer.Items.Add(row[0] + "" + row[1]);
                }
                comboBoxServer.Font = fontAll;
                Invoke((MethodInvoker)(() => Controls.Add(comboBoxServer)));
  });
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 public async void AnimShow()
        {
            await Task.Run(() =>
            {
                PictureBox Anim = new PictureBox();
                ((ISupportInitialize)(Anim)).BeginInit();
                Anim.Image = Image.FromFile(@"loading.gif");
                Anim.Location = new Point(115, 129);
                Anim.Size = new Size(66, 60);
                Anim.SizeMode = PictureBoxSizeMode.CenterImage;
                Anim.TabIndex = 3;
                Anim.TabStop = false;
                Invoke((MethodInvoker)(() => Controls.Add(Anim)));
            });
 
        }
C#
1
2
3
4
5
6
7
8
9
10
 case "Настройки подключения":
                    if (Showc) {
                        //запускаем Gif
                        AnimShow();
                        this.Height += 100;
                        //Запускаем загрузку
                        ServerInit();
                        //Stop
                        Showc = false;
                    }
Анимация работает, но под конец работы 2 метода выдает ошибку System.Reflection.TargetInvocationExcept ion: "Адресат вызова создал исключение." в классе Program в методе Application.Run(new StartUI());
Как сделать Правильно?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.03.2017, 09:34
Ответы с готовыми решениями:

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

Как динамически создавать контролы на разных parent-ах?
можно ли создать в отдельном модуле такую функцию AddSpeedButton(myparent: TObject; left, top: integer; glyph: TBitmap): TSpeedbutton,...

Как создавать "вложенные" контролы программно?
Форма, на этой форме Picturebox1, в нём ещё один Picturebox2(0), в Picturebox2(0) - Checkbox(0), в цикле надо динамически создавать...

3
Эксперт .NET
 Аватар для Rius
13114 / 7675 / 1674
Регистрация: 25.05.2015
Сообщений: 23,409
Записей в блоге: 14
02.03.2017, 10:46
В отдельном потоке получить список элементов, загрузить его в DataTable/List/т.п., завершить поток.
По завершению потока, выполнить синхронно с GUI операцию назначения списка (DataTable/List/т.п.) с элементами свойству DataSource контрола ComboBox.

"Анимацию" можно заменить на ProgressBar в режиме бесконечной прокрутки.
0
0 / 0 / 0
Регистрация: 04.02.2017
Сообщений: 4
02.03.2017, 19:11  [ТС]
Оказалось все работает если запустить заполнение в отдельном Tread потоке и элементы на которые ругается? вписать как Invoke((MethodInvoker)(() => Controls.Add(ComboBox1))); например, как реализовать с помощью async await я не нашел
0
Эксперт .NET
 Аватар для Rius
13114 / 7675 / 1674
Регистрация: 25.05.2015
Сообщений: 23,409
Записей в блоге: 14
02.03.2017, 19:21
Ещё раз:
данные получаем в отдельном потоке;
к контролу, находящемуся в потоке UI, источник данных подключаем кодом, выполняющимся внутри потока UI.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2017, 19:21
Помогаю со студенческими работами здесь

Динамический создавать контролы - элементы
Ребята есть такой код для создании таблицы: void tableCreate(String ab, String bb,String gg, String jj) { // for (int i = 1; i...

Как сохранить контролы?
На форме есть таблица из пользовательских контролов и её надо сохранить в файл и потом обратно восстановить. Как это можно реализовать?

Что лучше? создавать формы в Run_time или создавать в Design режиме.
(Excel) У меня 11 разных форм.С многими контроль-s. Поделитесь опытом 1.-Для быстрой загрузки файла при открытии и 2.-Для...

Как называются контролы в Аксессе?
Вопрос: как называются контролы в Аксессе (типа поле со списком = псп, зпр = запрос) кроме поля со списком, других сокращений не знаю

Как правильно перерисовывать контролы?
Наследую от того же button, но не могу перерисовать его никак. В событии перерисовке вроде-бы пишу, а толку ноль. Как же это нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru