Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обработка в параллель C# / 13 сообщений из 13, страница 1 из 1
16.03.2011, 10:24
    #37166990
Игорь86
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка в параллель C#
Всем привет.

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

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

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

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

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

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

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

Код: 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
16.03.2011, 18:27
    #37168520
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка в параллель C#
форма.Invoke((MethodInvoker) delegate() { форма.comboBox3.....;..... });
...
Рейтинг: 0 / 0
17.03.2011, 08:53
    #37169097
Игорь86
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка в параллель C#
barrabasформа.Invoke((MethodInvoker) delegate() { форма.comboBox3.....;..... });

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

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

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

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

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

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

Можно ли как то увеличить скорость обработки?
а там нужны 5000 записей?
как пользователь из них выберет нужную?
...
Рейтинг: 0 / 0
17.03.2011, 14:24
    #37170086
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка в параллель C#
ну или тогда заполняй комбобоксы в dowork
передай туда ссылку на form через аргумент
потом
form.Invoke((MethodInvoker) delegate() { form.comboBox2.Items.Add(...); });
...
Рейтинг: 0 / 0
17.03.2011, 14:41
    #37170147
Игорь86
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка в параллель C#
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
17.03.2011, 15:48
    #37170398
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка в параллель C#
Игорь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
17.03.2011, 15:51
    #37170414
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка в параллель C#
и вообще тут есть форум по winforms , там больше людей которые могут помочь, они сюда не заходят просто
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обработка в параллель C# / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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