powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обработка в параллель C#
13 сообщений из 13, страница 1 из 1
Обработка в параллель C#
    #37166990
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Народ, подскажите, пожалуйста.

Есть ситуация:

В момент выбора в combobox значения (свойство comboBox1_SelectedIndexChanged) начинают работать 3 запроса, которые заполняют 3 другие комбобокса.

В некоторых случаях они тормозят программулину, потому что работают последовательно.

Подскажите, пожалуйста, как можно эти 3 запроса запускать параллельно в момент выбора?

Может есть какие-либо мануалы? (Пожалуйста не предлагайте использовать google.ru или еще каким либо поисковиком, я постоянно им пользуюсь)
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37167122
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Справка по AutoResetEvent/ManualResetEvent или BackgroundWorker
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37167127
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полазить в неймспэйсе System.Threading
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37168506
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь выделить поток...

Пишу следующее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
private void sqlrayon_1() //Поток РАЙОН
        {
            OracleConnection conn21 = new OracleConnection(constr); //Подключение РАЙОН

            try //Попытка подключения к базе данных
            {
                conn21.Open(); //Открываем подключение

                string sqlstr21 = "SELECT trim(a.name1) ray, trim(a.code) kod FROM KLADR a WHERE a.code " +
                    "like '" + comboBox1.Text.Substring(comboBox1.Text.Length - 2, 2).ToString() + "___00000000' and " +
                    "a.code not like '" + comboBox1.Text.Substring(comboBox1.Text.Length - 2, 2).ToString() + "00000000000' order by 1"; //SQL-запрос на выбор района

                OracleCommand comm21 = new OracleCommand(sqlstr21, conn21); //Создаем команду для обработки запроса

                OracleDataReader dr21 = comm21.ExecuteReader(); //Создаем ридер для чтения данных из запроса

                if (dr21.HasRows) //Проверка на наличие записей
                {
                    while (dr21.Read()) //Пока ридер читает
                    {
                        comboBox2.Items.Add(Encoding.GetEncoding(1251).GetString(Encoding.GetEncoding(28591).GetBytes(dr21.GetString(0)))); //Добавление записи в Combobox
                        arrcodr.Add(dr21.GetString(1));
                    }
                }
                else
                {
                    conn21.Close(); //Закрываем подключение к Oracle
                    conn21.Dispose(); //Освобождаем процессы
                }

                dr21.Close(); //Закрываем ридер
                dr21.Dispose(); //Очищаем процессы
            }
            catch (OracleException ex21) //Ловим ошибку подключения
            {
                if (conn21.State != ConnectionState.Open) //Если подключение не открылось
                {
                    MessageBox.Show("Невозможно подключиться к базе данных. Проверьте наличие установленного OracleClient"); //Выводим сообщение
                }
                MessageBox.Show(ex21.ToString()); //Системное сообщение
            }
                finally //По завершению обработки
            {
                conn21.Close(); //Закрываем подключение
                conn21.Dispose(); //Очищаем
            }
        }

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) //Обработка выборанного региона
        {
            if (comboBox1.SelectedItem.ToString() != "") //Если Регион выбран
            {
                //-----ОБРАБОТКА КОМБОБОКСОВ

                comboBox2.Items.Clear(); //Очищаем
                comboBox2.Text = ""; //И текст
                comboBox2.Enabled = true; //Открываем для выбора
                comboBox3.Items.Clear(); //
                comboBox3.Text = ""; //
                comboBox3.Enabled = true; //
                comboBox4.Items.Clear(); //
                comboBox4.Text = ""; //
                comboBox4.Enabled = true; //

                //-----ОБРАБОТКА МАССИВОВ

                arrcodr.Clear();

                Thread t1 = new Thread(new ThreadStart(sqlrayon_1));
                t1.Start();
            }
        }

Появляется ошибка:
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "comboBox1" не из того потока, в котором он был создан.

Как сделать правильно?
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37168520
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
форма.Invoke((MethodInvoker) delegate() { форма.comboBox3.....;..... });
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37169097
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasформа.Invoke((MethodInvoker) delegate() { форма.comboBox3.....;..... });

А можно это как то на моем примере показать???
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37169518
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нельзя обращаться к форме и компонентам из другого потока просто так, нужно через Invoke
сделай не так.
используй BackgroundWorker он проще.
при начале выполнения блокируй изменения пользователем состояния обновляемого объекта (ведь пока ты всё не загрузил юзер еще раз может там чтото кликнуть в первом комбобоксе (например enable = false).
в теневой обработке заполняй коллекцию компонентов и присваивай в e.Result
по событию RunWorkerCompleted из e.Result заполняй свои комбобоксы
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37169986
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasнельзя обращаться к форме и компонентам из другого потока просто так, нужно через Invoke
сделай не так.
используй BackgroundWorker он проще.
при начале выполнения блокируй изменения пользователем состояния обновляемого объекта (ведь пока ты всё не загрузил юзер еще раз может там чтото кликнуть в первом комбобоксе (например enable = false).
в теневой обработке заполняй коллекцию компонентов и присваивай в e.Result
по событию RunWorkerCompleted из e.Result заполняй свои комбобоксы

Спасибо за совет...в проблеме разобрался...
Теперь проблема в следующем:

В момент выбора в 1-м комбобоксе некоторых значений, программуля притормаживает.
Притормаживает, как я понял, потому что в последний комбобокс тащится под 5000 записей.

Можно ли как то увеличить скорость обработки?
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37170059
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь86barrabasнельзя обращаться к форме и компонентам из другого потока просто так, нужно через Invoke
сделай не так.
используй BackgroundWorker он проще.
при начале выполнения блокируй изменения пользователем состояния обновляемого объекта (ведь пока ты всё не загрузил юзер еще раз может там чтото кликнуть в первом комбобоксе (например enable = false).
в теневой обработке заполняй коллекцию компонентов и присваивай в e.Result
по событию RunWorkerCompleted из e.Result заполняй свои комбобоксы

Спасибо за совет...в проблеме разобрался...
Теперь проблема в следующем:

В момент выбора в 1-м комбобоксе некоторых значений, программуля притормаживает.
Притормаживает, как я понял, потому что в последний комбобокс тащится под 5000 записей.

Можно ли как то увеличить скорость обработки?
а там нужны 5000 записей?
как пользователь из них выберет нужную?
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37170086
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну или тогда заполняй комбобоксы в dowork
передай туда ссылку на form через аргумент
потом
form.Invoke((MethodInvoker) delegate() { form.comboBox2.Items.Add(...); });
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37170147
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasИгорь86пропущено...


Спасибо за совет...в проблеме разобрался...
Теперь проблема в следующем:

В момент выбора в 1-м комбобоксе некоторых значений, программуля притормаживает.
Притормаживает, как я понял, потому что в последний комбобокс тащится под 5000 записей.

Можно ли как то увеличить скорость обработки?
а там нужны 5000 записей?
как пользователь из них выберет нужную?

Да записи нужны. На комбобоксе стоит автозаполнение по LISTITEMS.

Я решил немного по другому сделать. Не через потоки а в момент выбора в первом комбобоксе
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) //Обработка выборанного региона
        {
            if (comboBox1.SelectedItem.ToString() != "") //Если Регион выбран
            {
                //-----ОБРАБОТКА КОМБОБОКСОВ

                comboBox2.Items.Clear(); //Очищаем
                comboBox2.Text = ""; //И текст
                comboBox2.Enabled = false;
                comboBox2.Enabled = true; //Открываем для выбора
                comboBox3.Items.Clear(); //
                comboBox3.Text = ""; //
                comboBox3.Enabled = false;
                comboBox3.Enabled = true; //
                comboBox4.Items.Clear(); //
                comboBox4.Text = ""; //
                comboBox4.Enabled = false;
                comboBox4.Enabled = true; //

я обрабатываю 3 свойства

Код: plaintext
1.
2.
3.
private void comboBox2_EnabledChanged(object sender, EventArgs e) //РАЙОН(РЕГИОН)
private void comboBox3_EnabledChanged(object sender, EventArgs e) //ГОРОД(РЕГИОН)
private void comboBox4_EnabledChanged(object sender, EventArgs e) //НАСЕЛЕННЫЙ ПУНКТ(РЕГИОН)

в каждой из данных процедур обрабатывается свой запрос.

Как увеличить их время обработки?
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37170398
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь86barrabasпропущено...

а там нужны 5000 записей?
как пользователь из них выберет нужную?

Да записи нужны. На комбобоксе стоит автозаполнение по LISTITEMS.

Я решил немного по другому сделать. Не через потоки а в момент выбора в первом комбобоксе
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) //Обработка выборанного региона
        {
            if (comboBox1.SelectedItem.ToString() != "") //Если Регион выбран
            {
                //-----ОБРАБОТКА КОМБОБОКСОВ

                comboBox2.Items.Clear(); //Очищаем
                comboBox2.Text = ""; //И текст
                comboBox2.Enabled = false;
                comboBox2.Enabled = true; //Открываем для выбора
                comboBox3.Items.Clear(); //
                comboBox3.Text = ""; //
                comboBox3.Enabled = false;
                comboBox3.Enabled = true; //
                comboBox4.Items.Clear(); //
                comboBox4.Text = ""; //
                comboBox4.Enabled = false;
                comboBox4.Enabled = true; //

я обрабатываю 3 свойства

Код: plaintext
1.
2.
3.
private void comboBox2_EnabledChanged(object sender, EventArgs e) //РАЙОН(РЕГИОН)
private void comboBox3_EnabledChanged(object sender, EventArgs e) //ГОРОД(РЕГИОН)
private void comboBox4_EnabledChanged(object sender, EventArgs e) //НАСЕЛЕННЫЙ ПУНКТ(РЕГИОН)

в каждой из данных процедур обрабатывается свой запрос.

Как увеличить их время обработки?
не использовать комбобокс или найти/написать нестандартный с виртуальным режимом, это когда не добавляются все itemы, а просто меняется текст в тех что отображаются по мере прокрутки.
из 5000 записей визуально выбрать не реально (а заполнение занимает кучу времени). ты можешь наполнить массив значениями, поставить комбобокс и заполнять только при вводе первых букв ну или не комбобокс а текстбокс с автоподстановкой (свойства AutoComplete*).
...
Рейтинг: 0 / 0
Обработка в параллель C#
    #37170414
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вообще тут есть форум по winforms , там больше людей которые могут помочь, они сюда не заходят просто
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обработка в параллель C#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]