Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
154 / 153 / 29
Регистрация: 21.05.2010
Сообщений: 338

Операции в BackgroundWorker завешивают форму

14.11.2012, 14:42. Показов 4693. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! У меня следующая проблема:
некие вычисления нужно проводить в bgWorker'е и после выводить в ListView. В bgWorker_DoWork я вызываю метод, который производит эти самые расчёты. Называется он "loadCustomGroups". В теле этого метода всё выполняется корректно, но доходя до:
C#
1
2
3
4
5
6
7
8
9
10
11
if (lstSalesProgram.InvokeRequired) // lstSalesProgram - мой ListView
            {
                this.BeginInvoke(new MethodInvoker(delegate
                {
                    SetLstSalesProgram(lstSalesProgram, lstCutomGroups);
                }));
            }
            else
            {
                SetLstSalesProgram(lstSalesProgram, lstCutomGroups);
            }
метод SetLstSalesProgram начинает отрабатывать в основном потоке (как я понял). Т.е. программа "виснет" на некоторое время, после всё благополучно загружается. Вот само тело метода SetLstSalesProgram:

C#
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
private void SetLstSalesProgram(DevExpress.XtraTreeList.TreeList lstSalesProgram, List<SalesProgramItem> lstCutomGroups)
        {
            SetProgressInfo("Окончание операции.");
            foreach (SalesProgramItem item in lstCutomGroups.OrderBy(l => l.PARENT_ID))
            {
                if (cancel)
                {
                    bgWorker.CancelAsync(); return;
                }
 
                this.lstSalesProgram.AppendNode(new object[] {
                    item.Name,
                    item.SalesValue,
                    item.SalesValue
                },
                item.PARENT_ID == 0 ? null : FindNodeByTag(item.PARENT_ID)
                );
 
                foreach (TreeListNode n in this.lstSalesProgram.Nodes)
                {
                    if (cancel)
                    {
                        bgWorker.CancelAsync(); return;
                    }
 
                    if (n.Tag == null)
                    {
                        n.Tag = item;
                        break;
                    }
                    else
                    {
                        foreach (TreeListNode childN in n.Nodes)
                        {
                            if (cancel)
                            {
                                bgWorker.CancelAsync(); return;
                            }
 
                            if (childN.Tag == null)
                            {
                                childN.Tag = item;
                                break;
                            }
                        }
                    }
                }
            }            
        }
p.s.: это моё дебютное сообщение на форуме, посему прошу прощения за возможную "кривость".
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.11.2012, 14:42
Ответы с готовыми решениями:

Не срабатывает отмена асинхронной операции в BackgroundWorker
Здравствуйте! Пишу приложение для пингования доступности списка IP-адресов. на даный момент при нажатии кнопки Старт/Стоп, код которой...

Передать информацию о работе BackgroundWorker в основную форму
Собственно суть задачи: имеется форма на ней кнопка, по нажатию на которую через background worker запускается функция в статичном классе....

Вывести из BackgroundWorker на форму
Пишу записи из файла в базу.Файлы заархивированы. Один поток разархивирует и кладёт в нужные папки, другой записывает из файлов в базу....

24
154 / 153 / 29
Регистрация: 21.05.2010
Сообщений: 338
15.11.2012, 14:27  [ТС]
Студворк — интернет-сервис помощи студентам
turbanoff, если убрать SetLstSalesProgram - форма не виснет, но и узлы не добавляются. Проверил SetLstSalesProgram - точно все Invoke'и поубирал.
Судя из Stopwatch - всё идёт с одинаковой скоростью. Просто цикл слишком большой - там около 2500 записей.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
15.11.2012, 14:42
Вот совет из доки:
In order to add multiple nodes to the collection, try to enclose the Add method into the TreeList.BeginUpdate/TreeList.EndUpdate and TreeList.LockReloadNodes/TreeList.UnlockReloadNodes methods in order to avoid multiple control updates.
Также подозреваю, что тормозит метод FindNodeByTag(item.PARENT_ID). Попоробуйте убрать его и пока просто добавлять все в корень, и посмотрите увеличится скорость или нет.
0
154 / 153 / 29
Регистрация: 21.05.2010
Сообщений: 338
15.11.2012, 14:46  [ТС]
turbanoff, сделал - скорость та же. Да и в принципе не в том соль, что он долго формирует. Пускай. Дело в том, что у меня форма виснет на это время и я не могу нажать "Отмена", ProgressBar "не крутиться". Форма тупо виснет. Даже закрыть её нельзя.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
15.11.2012, 14:48
И TreeList.BeginUpdate/TreeList.EndUpdate и TreeList.LockReloadNodes/TreeList.UnlockReloadNodes тоже вызывали?
В качестве костыля можно после добавления очередного узла (или нескольких) вызывать
C#
1
Application.DoEvents();
1
154 / 153 / 29
Регистрация: 21.05.2010
Сообщений: 338
15.11.2012, 19:25  [ТС]
turbanoff, при использовании Application.DoEvents() проблема практически решается кроме того, что не отрабатывает FindNodeByTag. Т.е. все узлы заносятся в корень.

Решил не использовать ListView, т.к. слишком долго. Буду реализовывать другим способом, который по-моему мнению будет более эффективен.
Всем спасибо за участие, в частности turbanoff. Вам +1 за помощь. Ещё раз всем спасибо!

Добавлено через 2 часа 45 минут
Если кому будет интересно - переделал следующим образом:
при загрузке формы единожды формируются 2 листа - родительский и дочерний.
Всё это "загоняется" в 2 ObjectListView соответственно (в одном родители, в другом - дети). По клику на родителя происходит обновление "дочернего" ObjectListView:
C#
1
2
3
4
5
6
private void objLVGroups_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (objLVGroups.SelectedObject == null)
                return;
            objLVProducts.SetObjects(lstCustomProducts.Where(p => p.PARENT_ID == (objLVGroups.SelectedObject as SalesProgramProductGroup).ID));
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2012, 19:25

Совместное использование Invoke и lock завешивают приложение
Каждый раз, когда использую lock и Invoke вместе, приложение намертво зависает. Например, так: ...

Часы завешивают браузер
Всем привет! Изучаю JS и решил написать нубо часы которые идут в title. Но вот проблема, часики идут и через n секунд браузер виснет. ...

Заблокировать форму на время выполнения операции
Есть необходимость на время выполнения некоторой операции предотвратить нажатие и прочие действия на форме. Есть ли универсальное решение?...

Битовые операции. Перевести число в двоичную форму
Объясните пожалуйста код: Да и еще, как обратиться к определенному биту? Спасибо! #include &lt;iostream&gt; using namespace std;...

Как скрыть главную форму чтобы выполнить другие операции на этой же форме
скажите пожалуйста как скрыть главную форму чтобы выполнить другие операции на этой же форме Добавлено через 1 минуту как вставить...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru