С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для afapasha
28 / 28 / 19
Регистрация: 12.10.2014
Сообщений: 98

Зависание контрола DataGridView при добавлении Row из других потоков

31.10.2016, 18:57. Показов 3049. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На форме имеется грид с 4 колонками.
Существует класс, в котором несколько потоков выполняют определённый метод и при нужном условии вызывают событие, которое, в свою очередь, вызывает на форме метод вида:
C#
1
2
3
4
private void requestManager_OnGoodPerson(object sender, ConfirmedPersonEventArgs e)
        {            
                dgvPersons.Rows.Add($"{e.Name}:{e.Surname}", e.Age, e.Salary, e.PersonalNumber);
        }
В первые секунды всё работает нормально, но после быстрого наплыва событий, контрол(Не форма) перестаёт работать корректно(На нём уже нельзя выбрать нужный элемент и перестают добавляться новые записи).
Я подумал, может нужно синхронизировать доступ к гриду, т.к (Может быть, не уверен) метод вызываемый событием выполняется в том же потоке, который его вызвал), В общем добавил lock, но и это тоже не помогло.

Объясните как Грамотно реализовать данную задачу, Спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.10.2016, 18:57
Ответы с готовыми решениями:

Ошибка при добавлении своего контрола на форму
Здравствуйте! У меня постоянно возникает одна и та же ошибка. Лично для меня не слишком критичная, но в некоторых моментах критичная. ...

Зависание домашней сети при добавлении ПК
Доброго времени суток дома установлен роутер ZyXEL Keenetic Omni II пока в сети 2 ноутбука и 2 смартфона все отлично работает...

Ошибка при добавлении пользовательского контрола на форму в режиме дизайнера
Либа написанная мною для личных нужд. В нее написал новый юзерконтрол , включающий те которые в этой либе были. Повесил этот компонент на...

3
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
31.10.2016, 19:35
Цитата Сообщение от afapasha Посмотреть сообщение
Объясните как Грамотно реализовать данную задачу
Ну во-первых, данные нужно заносить не в DGV, а в модель данных. DGV должна только отображать модель через DataBinding, или через виртуальный режим.
Далее, если используется DataBinging, то при добавлении данных в список, нужно использовать метод Invoke для перевызова метода в главном потоке (поскольку биндинг вызывает перестройку грида, а грид, как и все контролы работает только в главном потоке). Этот метод можно использовать при относительно медленном потоке данных.
Если же используется виртуальный режим, то Invoke не требуется , а просто увеличивается число строк грида и вызывается Invlidate у грида. Если данные добавляются очень быстро (например сотни в секунду), тогда делается немного по-другому. Данные в список добавляются в обычном режиме, без вызова Invalidate, но параллельно работает таймер, который раз в секунду в главном потоке увеличивает число строк датагрида и вызывает Invalidate.
0
 Аватар для afapasha
28 / 28 / 19
Регистрация: 12.10.2014
Сообщений: 98
31.10.2016, 19:51  [ТС]
Storm23, Я пытался привязать к биндингу, но у меня вопрос появился, биндинг получил запись, я вызвал метод отображения его в гриде, но когда у меня будет 1000+ записей, не будет ли зависать грид при перестройке?

Добавлено через 11 минут
Сделал через виртуальный режим, контрол теперь не зависает, элементы добавляются, но их значения не отображаются, просто пустые поля, разбираюсь в чем проблема теперь
Если есть свободное время, прошу сбросить пример с работой через виртуальный режим
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
31.10.2016, 20:14
Лучший ответ Сообщение было отмечено afapasha как решение

Решение

Цитата Сообщение от afapasha Посмотреть сообщение
их значения не отображаются
А вы событие CellValueNeeded обрабатываете? Без него данные в грид никак не попадут.
Цитата Сообщение от afapasha Посмотреть сообщение
пример с работой через виртуальный режим
Архитектура ПО в WinForms (FAQ & HowTo)
https://www.cyberforum.ru/blog... g3838.html
Альтернатива Invoke при изменении GUI с другого потока
Добавление строк в datagridview в другом потоке

Цитата Сообщение от afapasha Посмотреть сообщение
но когда у меня будет 1000+ записей, не будет ли зависать грид при перестройке?
На 1000 - не будет зависать, на 100000 - будет. Если нужно отображать очень много данных, то альтернативы виртуальному режиму - нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.10.2016, 20:14
Помогаю со студенческими работами здесь

Зависание потоков при обращени к ListBox
Столкнулся со следующей проблемой. Есть основная форма приложения. Есть рабочие потоки. В качестве логера им передается адрес ListBox'a на...

Как правильно подбирать значение положения контрола при динамическом добавлении в panel?
В программе динамически добавляется в панель несколько элементов panel1.Controls.Add(qwerty);// где qwerty контрол в программе...

Тупит отладчик при отладке других потоков
у меня vs community 2015, при отладке других потоков (созданных своим же приложением) отладчик тупить начинает, т.е. например если...

Форма подвисает при выводе на неё из других потоков
Доброго времени суток, проблема такая: пишу прогу для АСУТП, которая должна считывать множество данных с устройства и выводить их. Для...

Ошибка при добавлении данных в datagridview
Есть бд сделанная в acess. При добавлении данных в одной форме,они должны перейти на другую и появится в datagridview. Но при нажатии...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru