|
2 / 2 / 0
Регистрация: 18.06.2016
Сообщений: 143
|
|||||||||||
.NET 4.x Потоко-безопасный ObservableCollection с AddRange15.09.2017, 16:09. Показов 5766. Ответов 9
Вообщем, я заполняю в нескольких потоках массив. на данный момент использую "List<ExpandoObject> Вывод" из-за "AddRange"(щас отлаживаю скорость работы по обработке данных). Он заполняется достаточно долго, а содержимое надо отображать "как подгрузилось". Т.е. скажем 30000 записей всего, а отображение делается каждую "1000(тысячную)" запись. Ну. Запустил поток, он порождает несколько потоков(в зависимости от процессора) и оно в свою очередь(эти несколько потоков) "строят кусочек 1000" во временный массив. После прохода по текущей "1000"(несколько потоков закончились) происходит запись в "List" через AddRange(Скажем: 5 потоков - записывается результат из каждого в List<ExpandoObject> через AddRange). Но надо это отобразить(отображать, когда кусок "1000" занесено в List<ExpandoObject> Вывод) в контроле(RadGridView - это типо DataGrid-контрол в Telerik). Но у него не реализован "INotifyPropertyChanged". А ObservableCollection есть, но он "не потоко-безопасный".
Собственно вопрос: какой выход из ситуации? В инете нашёл "AddRange" для ObservableCollection. Кликните здесь для просмотра всего текста
Как сделать "Потоко-Безопасным"? *ExpandoObject нужен т.к. количество "колонок" переменчивое, в зависимости от того, на что ткнул я. Добавлено через 4 часа 38 минут Или может другой вопрос: как отдать команду контролу на переотрисовку содержимого(в случае когда "List<ExpandoObject> Вывод" является ItemsSource)? ***.Items.Refresh(); не работает(Но вот перезадание ItemsSource или перегрупировка - отрисовывают содержимое. Только проблема: мне надо сохранить то, куда "я прокрутил", и только в конец добавлять. Т.е. если я раскрыл группировку - то она должна остаться раскрытой.). Для упрощения, т.к. не все могли работать с "RadGridView", предлагаю говорить об "DataGrid". Думаю это поможет найти ответ. Добавлено через 7 минут Может быть похожий вопрос задавался? Я буду рад любой информации. Конечно же я был в поисковике и видел что-то типа https://msdn.microsoft.com/ru-... .110).aspx Только я не понял: как такое применить к "ExpandoObject". В смысле на примере. Он без свойств. Динамический. Также видел Кликните здесь для просмотра всего текста
(ссылка не видна. Вот скопировал.) Но почему-то у меня подчёркивает красным "DispatchingObservableCollection" и "StatisticsModel". Что я не подключил? Не по теме: Я просто, вернувшись к своему сообщению - прочитал и понял что надо "дописать инфу"
0
|
|||||||||||
| 15.09.2017, 16:09 | |
|
Ответы с готовыми решениями:
9
Как отобразить ObservableCollection<ObservableCollection<Page>> ? Не безопасный код, почему он не безопасный. Потоко-независимая очередь записывает 2е команды в одну ячейку. Почему ? |
|
2 / 2 / 0
Регистрация: 18.06.2016
Сообщений: 143
|
|
| 16.09.2017, 17:10 [ТС] | |
|
Может я вообще неправильно подошёл к вопросу? Главная цель: Нажал на кнопку - начался вывод кусками. по 1000 штук. Т.е. запустился фоновой поток и в конец DataGrid добавляет элементы. Которые должны группироваться. При этом не трогая уже нарисованные группы(т.е. я открываю группы, а оно в конец продолжает добавлять элементы\НовыеГруппы с элементами).
0
|
|
|
|
|||
| 17.09.2017, 17:08 | |||
Сообщение было отмечено edward_freedom как решение
Решение
47911, я когда-то давно задавался подобным вопросом. Насколько я помню, я даже находил готовую реализацию VirtualizingObservableCollection. Суть в том, что когда ты прокручиваешь список, то данные в коллекцию в фоне подгружаются. В общем, погугли.
Вот ещё может быть полезно: Виртуализация Добавлено через 3 минуты Нашёл. Вот этот пример мне попадался. Только он был не на хабре, в принципе, не суть ![]() https://habrahabr.ru/post/208792/ Добавлено через 50 секунд Точно, вот исходник https://www.codeproject.com/Ar... ualization Добавлено через 6 минут Слушай, ты бы чуток подробнее изъяснялся, а то несколько раз перечитывал и всё равно есть вопросы. Подробнее - это называть, что откуда и куда не упуская детали (из коллекции Один в коллекцию Два, чтобы отобразить в RadGridView , вероятно, мимо прошло много людей по причине не полного понимания). Как я понял List<ExpandoObject> Вывод прибинден к RadGridView .
2
|
|||
|
2 / 2 / 0
Регистрация: 18.06.2016
Сообщений: 143
|
|||||||||||||||||
| 17.09.2017, 20:41 [ТС] | |||||||||||||||||
|
Не по теме:
Casper-SC, ваши ссылки - как раз по теме. Только вот проблема ".NET 4.0" потолок. Однако: "RadGridView от Telerik" обладает "VirtualizingStackPanel.IsVirtualizing=" True"". В то время как "DataGrid" в ".NET 4.0" нет. Поэтому и "RadGridView" т.к. он типо доработаный "DataGrid"(настолько, что прям слёзы наворачиваются). Поэтому я и сказал "Для упрощения, т.к. не все могли работать с "RadGridView", предлагаю говорить об "DataGrid"". Логика программы:
2) Запустился фоновой поток 3) Он, сделав некоторые приготовления, запускает несколько фоновых(для упрощения -> 5 шт.) 4) Каждый поток подключается к базе и высасывает "Свою 200 шт." товаров, и записывает в "List<ExpandoObject> Кусок" 5) после отработки всех 5 потоков - запуск 2 стадии - записываем всё из "List<ExpandoObject> Кусок" в "List<ExpandoObject> Вывод". 5.1) Пытаемся сказать "Грид" что у нас изменения в "List<ExpandoObject> Вывод". "Грид.Items.Refresh();" не сработало. Мой мозг говорит, что так:
Собственно надо чтобы после добавления "1000" человек мог продолжать работать, и максимум что видеть "появляются какие-то записи". В конце. Т.е. тыкает на кнопки, раскрывает группы - и радуется. А если делать так, как мой мозг говорил "не делать" - сбрасываются "Раскрытые группировки"(в смысле закрываются, т.к. переотрисовка), то, что натыкал - исчезает(визуально. Сама прога то отлавливает тыки, но визуально всё пропадает). Вообщем пытаюсь сделать удобство работы с 1 000 000 записями. Выводя их постепенно. Может я подошёл не правильно к этой задаче? Постраничный вывод - не вариант. Можно использовать "ObservableRangeCollection<ExpandoObject > Вывод"("В инете нашёл "AddRange" для ObservableCollection." - первый пост), но он "Потоко не безопасный". Т.к. в ситуации когда его дёргают несколько потоков - он убивает программу. Да и не уверен что он будет "Оповещать Грид" только когда "AddRange" закончится, а не после "каждой итерации"(не проверил, т.к. несколько потоков - и он убивает прогу). Я достаточно понятно описал проблему и мой ход мыслей?
0
|
|||||||||||||||||
|
|
|||||||
| 17.09.2017, 21:30 | |||||||
|
47911, интересует, почему используется не ObservableCollection<T>, а List<T>? Потому что в List<T> есть AddRange и он не валит программу при добавлении элементов в коллекцию?
Так, то есть нужно уметь в коллекцию добавлять сразу диапазон значений и после добавления оповещать UI, что мы добавили. Ок. Нужно уметь добавлять в коллекцию значения из нескольких потоков. Добавлено через 3 минуты Добавлено через 6 минут Я нагуглил такие дела: https://mvvmutils.codeplex.com... lection.cs https://www.codeproject.com/Ti... Collection Добавлено через 2 минуты Можно взять за основу ConcurrentObservableCollection<T> и добавить туда AddRange так, чтобы коллекция не оповещала о своём изменении до конца выполнения AddRange. Добавлено через 2 минуты По крайней мере я посмотрел пример, и увидел, что в коллекцию там добавляются данные не из UI потока и всё работает, осталось допилить недостающий метод. Это самое быстрое решение в плане трудозатрат. Добавлено через 2 минуты Кстати, ничего не нужно допиливать, всё уже есть:
И ещё, первый исходник, что ты показал вызывает сомнения с его локом входящей коллекции. А вот эти исходники, что я нагуглил внушают доверие. Правда, понятно, что я мельком посмотрел, не изучал пол дня ![]() Добавлено через 4 минуты Отпишись хоть потом, что и как. Интересно, как в итоге проблема решится.
1
|
|||||||
|
2 / 2 / 0
Регистрация: 18.06.2016
Сообщений: 143
|
|||||||||||||||||||
| 17.09.2017, 21:33 [ТС] | |||||||||||||||||||
В течении 12-14 часов опробую, т.к. время очень позднее. И хотел бы я уточнить: можно же в DataGrid'е указать группировку 1 раз, чтобы при добавлении "Новых данных"(товаров) - они сразу попадали в группировку? Что было у меня: Загружается программа, что-то делает, + это:
Что в самом гриде:
*Я смотрел пример https://docs.microsoft.com/en-... id-control и даже запускал у себя. Но что-то не вкурил.*
0
|
|||||||||||||||||||
|
|
||
| 17.09.2017, 21:36 | ||
|
Кстати, я смотрел вот это:
https://www.codeproject.com/Ar... ary-and-So А привёл другие ссылки. Там, думаю, тоже рабочие варианты. Добавлено через 2 минуты Убери эти AddRange и RemoveRange, они там вообще ни к месту и не факт, что не нарушат работу коллекции.
1
|
||
|
2 / 2 / 0
Регистрация: 18.06.2016
Сообщений: 143
|
|
| 17.09.2017, 21:44 [ТС] | |
|
Casper-SC, а опыт с группировкой DataGrid есть? Можешь подсказать "как заставить его всегда группировать данные"(сказать ему это 1 раз и забыть об этом)?
*Возможно этот код лежит на поверхности. Просплюсь и пересмотрю примеры с MSDN ещё раз.*
0
|
|
|
2 / 2 / 0
Регистрация: 18.06.2016
Сообщений: 143
|
|||||||
| 25.09.2017, 05:45 [ТС] | |||||||
|
Пример:
А по поводу "Главного Вопроса" этой темы - рекомендация уже была дана, смотрите выше.
0
|
|||||||
| 25.09.2017, 05:45 | |
|
Помогаю со студенческими работами здесь
10
Parameters.addRange .Items.AddRange HttpWebRequest не воспринимает AddRange
метод Add и AddRange Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|