|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||||||||||||||||||
Синхронизация асинхронного заполения списка и CancellationToken06.10.2021, 14:07. Показов 8755. Ответов 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,719
|
|
| 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,719
|
||
| 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,719
|
||
| 10.10.2021, 02:41 | ||
|
1
|
||
| 10.10.2021, 02:41 | |
|
Данные об отделах ( процент заполения )
Почему CancellationToken не сбрасывает Token Проверка на правильность заполения полей Отправка формы после проверки заполения reCAPTCHA Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
|
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
|
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
|
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0)
Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона
Уважаемые коллеги!
В продолжение. . .
|
|
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии
Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
|
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью.
Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
|
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза
Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
|
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма
Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
|