|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||||||||||||||||||
Синхронизация асинхронного заполения списка и CancellationToken06.10.2021, 14:07. Показов 8757. Ответов 95
Метки нет (Все метки)
Открываю GUI страницу со списком картинок.
Проблема: из-за того, что картинки весят много -- какое-то время, допустим 2 секунды, страница просто пустая, а после резко заполняется всем списком. Желаемый результат: хотелось бы, чтобы при открывании страницы элементы постепенно подгружались. Решение 1: решил сделать само заполнение асинхронным (просьба сначала досмотреть все 3 решения)
Решение 2: добавил локировку
Решение 3: я подумал, что во время закрытия страницы будет уместным сделать cancelTokenSource.Cancel();
Добавлено через 9 минут Также хотел упомянуть следущий момент:
0
|
|||||||||||||||||||||||||||
| 06.10.2021, 14:07 | |
|
Ответы с готовыми решениями:
95
BlockingCollection<T>, Add(T item, CancellationToken cancellationToken); Зачем нужен CancellationToken? Не происходит отмена задачи (CancellationToken) |
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||
| 09.10.2021, 18:28 [ТС] | ||||||
|
Элд Хасп, сделал небольшой тест, предварительно увеличив количество элементов, чтобы уменьшить время погрешности.
Суммарное количество элементов -- 256 Начало - 18:19:47 Конец - 18:19:58 То есть страница открылась, но 10 секунд страница пустая. За одну секунду -- 22 элемента
0
|
||||||
|
Модератор
|
||||||
| 09.10.2021, 18:48 | ||||||
|
limeniye, это означает, что долго происходит создание представления одного элемента.
На один элемент требуется порядка 50мс - это много, конечно. Чтобы сделать поэлементный показ в представлении, то нужно каждый элемент добавлять в отдельной задаче:
0
|
||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 09.10.2021, 18:56 [ТС] | |
|
Элд Хасп, я запутался. Все остальное было InvokeOnMainThreadAsync, через Task
Task.Run(async () => await Device.InvokeOnMainThreadAsync(() => Devices[index] = newDevice));Почему сейчас синхронно?
0
|
|
|
Модератор
|
||
| 09.10.2021, 19:15 | ||
|
BeginInvokeOnMainThread - ставит задачу в очередь. InvokeOnMainThreadAsync - ставит в очередь и ожидает её выполнения. Это Xamarin - я его не знаю. Но по аналогии с другими подобными методами. Ожидание не влияет на лаги GUI поскольку весь метод выполняется в отдельной задаче на пуле потоков. Для BeginInvokeOnMainThread, в общем случае, мы создаём 256 отдельных задач и все их ставим в очередь на исполнение, но мы не можем гарантированно знать в каком порядке они будут выполнены. В результате можем получить иной порядок чем в коллекции filterDevices.Values.В с методом InvokeOnMainThreadAsync мы добавляем один элемент, ждём пока завершится его добавление, потом добавляем следующий. Добавлено через 3 минуты Точно не гарантирую, что так будет работать - как уже писал, не знаю Xamarin. Но ожидаю вот такой работы.
1
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||
| 09.10.2021, 19:31 [ТС] | ||||||
|
Элд Хасп, страница открывается без лагов, но когда начинает отрисовывать элементы -- залагивает, пока не отобразятся. Тем не менее по отладке результат лучше.
0
|
||||||
|
Модератор
|
||
| 09.10.2021, 20:00 | ||
|
Надо разбираться уже с оптимизацией создания представления для одного элемента коллекции. Так как одновременно все элементы Devices в GUI не требуется представлять, то кроме оптимизации представления элемента, желательно ещё использовать виртуализацию. Но вот как её реализовать на Xamarin я без понятия.
1
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 09.10.2021, 20:07 [ТС] | ||
|
Но мне удалось прогружать элементы асинхронно, если я использую следующую запись https://www.cyberforum.ru/csha... st15753916 При ней страница открывается без лагов и отрисовывает первый элемент, потом второй... потом ползунок справа страницы(для скроллинга) начинает уменьшаться, ибо элементов в списке становится больше.
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 09.10.2021, 21:22 [ТС] | |
|
0
|
|
|
Модератор
|
||
| 09.10.2021, 21:45 | ||
|
А в Xamarin его вроде нет. Добавлено через 2 минуты limeniye, может вы эту реализацию используете? https://gist.github.com/thomaslevesque/10023516
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||
| 09.10.2021, 22:06 [ТС] | ||||||
|
Элд Хасп, я начал в этом сомневаться
0
|
||||||
|
Модератор
|
||
| 10.10.2021, 00:18 | ||
|
Моя реализация кривая, делалась для изучения, а не практического применения. Поэтому я хотел от неё избавиться. Эта нормальная реализация. Можно даже сократить её (для WPF точно, а для Xamarin проверьте сами). Методы OnPropertyChanged и RaisePropertyChanged (два последних в коде) - не нужны. Их можно удалить.
0
|
||
|
1531 / 534 / 127
Регистрация: 09.01.2018
Сообщений: 1,732
|
|
| 10.10.2021, 00:31 | |
|
limeniye, у вас этот метод что возвращает
devicesRepository.GetDevices?
0
|
|
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||||||||||||
| 10.10.2021, 01:39 [ТС] | |||||||||||||||||||||
|
На выходе -- это тот же тип, что и у списка Devices, а Devices -- это DeviceViewModel. Не по теме:
Использую ObservableCollection. Я провёл много запусков и заметил очень странное поведение программы. (для теста убрал картинки, просто отображение прямоугольных элементов с текстом) Периодически случаются такие моменты, что список открывается за 1 секунду. Чаще всего такое случается, когда я деплою приложение и открываю список в первый раз. То есть страница открывается, как обычно, без остановок, гладко, потом фриз на 1 секунду и сразу появляются 256 элементов. Но в большинстве случаев страница открывается и 7-12 секунд ничего не происходит, а потом отображаются все элементы. Я теперь в полном замешательстве. Откуда ноги растут -- не понимаю. Такое ощущение, что девайс способен обработать и отобразить такое количество информации, но при каких-то особых условиях. Но самое странное, что мне удалось зафиксировать поведение отладчика, которое меня вообще полностью вводит в ступор. Отображение элементов через 7 секунд после открытия страницы
Также, в качестве элемента "Прямоугольник" я использую Frame (то же самое что и Border в WPF). И в случае, где элементы появились после 7 секунд пишет
Добавлено через 13 минут Task<List<DeviceViewModel>>
0
|
|||||||||||||||||||||
|
Модератор
|
||||||||
| 10.10.2021, 01:57 | ||||||||
|
Там существенный момент - это маршалинг события CollectionChanged в основной поток. Но существенно для этого типа, что экземпляр AsyncObservableCollection обязательно! должен создаваться в основном потоке. Иначе не произойдёт захват контекста синхронизации. Если VM с этой коллекцией у вас создаётся синхронным кодом в App или Code Behind любого UI элемента (в том числе Окна, UserConrol, Page)? то всё будет Ок. Вот код который должен быть:
Я с ним совершенно не знаком. Поэтому только "методом тыка".
1
|
||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 10.10.2021, 02:03 [ТС] | |
|
0
|
|
|
1531 / 534 / 127
Регистрация: 09.01.2018
Сообщений: 1,732
|
||
| 10.10.2021, 02:05 | ||
|
1
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||
| 10.10.2021, 02:29 [ТС] | |||||||
|
Элд Хасп, теперь я не понял что мне нужно, а что не нужно. Нужно ли, при такой записи AsyncObservableCollection использовать локировку? Нужно ли использовать следующую запись
Task.Run(async () => await Device.InvokeOnMainThreadAsync(() => Devices.Clear()));, или же можно ограничиться обычным Devices.Clear();?В данный момент выглядит так:
0
|
|||||||
|
Модератор
|
||||
| 10.10.2021, 02:39 | ||||
|
Если да, то передайте null. Добавлено через 1 минуту Проблема возникает при создании представлений для элементов этого списка. Добавлено через 1 минуту Пока один вызов что-то меняет в коллекции, чтобы другой вызов ему не мешал. Есть такая вероятность?
1
|
||||
|
1531 / 534 / 127
Регистрация: 09.01.2018
Сообщений: 1,732
|
||
| 10.10.2021, 02:41 | ||
|
1
|
||
| 10.10.2021, 02:41 | |
|
Данные об отделах ( процент заполения )
Почему CancellationToken не сбрасывает Token Проверка на правильность заполения полей Отправка формы после проверки заполения reCAPTCHA Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 30. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем
**Полевые заметки о двухнедельной совместной работе**. . .
|
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики
1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
|
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928
Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
|
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего
Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
|
|
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы
Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
|
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока
Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
|
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
|
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат»
Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
|