|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||||||||||||||||||
Синхронизация асинхронного заполения списка и CancellationToken06.10.2021, 14:07. Показов 8822. Ответов 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) |
|
Модератор
|
||
| 10.10.2021, 19:51 | ||
|
Это не UI элемент. Каким типом в DeviceViewModel отражена картинка? GUID, ImegeSource, поток, другое? И уже потом EntityImage строит по полученному Entity по данным из DeviceViewModel отображение картинки. Вот надо понять в чём тормоза. Просто сам вывод картинок в Xamarin это долго. Или конкретно в этом случае получение данных для картинки по DeviceViewModel это долгий процесс.
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||
| 10.10.2021, 19:52 [ТС] | ||||||||||||
|
Сейчас отправлю подробнее:
0
|
||||||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||
| 10.10.2021, 19:58 [ТС] | ||||||||
![]() Добавлено через 3 минуты Например локально будет так:
0
|
||||||||
|
Модератор
|
|||
| 10.10.2021, 20:02 | |||
|
То есть основные тормоза создаёт controls:EntityImage ?Надо тогда разбираться в его логике. И мне всё равно кажется, что даже без картинок вывод 7 секунд - это очень много. Хотя может для Xamarin это нормально. Добавлено через 2 минуты BitmapExtensions.LoadBitmapResource?В каком потоке выполняется? Можно ли его dspsdfnm на потоке пула?
0
|
|||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||
| 10.10.2021, 22:12 [ТС] | |||||||||||
|
Одну из проблем я нашёл:
вот так не лагает
0
|
|||||||||||
|
Модератор
|
|||
| 10.10.2021, 22:40 | |||
|
У него же марщалинг в UI поток каждого действия. Я поэтому и отказался от его использования. Но вот я не пойму как вы используете простой ObservableCollection без маршалинга и синхронизации привязок. На WPF простой ObservableCollection при изменении из других потоков выкидывает исключения. Наверное, в Xamarin это реализовано по другому. Это надо тестить, разбираться. Документации толковой очень мало. А на все эти тесты нет времени. Вы проверяли, что у вас содержит var devices?Там точно не нулл? У вас же нет ожидания результата. И сама по себе строчка Task.Run(async () => await devicesRepository.GetDevices(id)).Result, вроде, эквивалентна devicesRepository.GetDevices(id).Result.Добавлено через 2 минуты limeniye, и вы отказались от асинхронного метода? Сделали UpdateDevicesWithCancellationTokenChecke r синхронным?
0
|
|||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||
| 10.10.2021, 22:52 [ТС] | |||||
|
Добавлено через 53 секунды Добавлено через 2 минуты Но, как я понимаю, если пишу Result -- то будет автоматическое ожидание, когда из devices понадобится взять значение, если оно ещё не пришло туда. Верно? Добавлено через 1 минуту
0
|
|||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 11.10.2021, 00:57 [ТС] | |
|
Элд Хасп, тот метод, который возвращал null я переделал уже. Там будет пустой список.
0
|
|
|
608 / 390 / 198
Регистрация: 31.03.2013
Сообщений: 2,700
|
||
| 11.10.2021, 12:10 | ||
|
не проще возвращать сразу photoDocument?
2
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 11.10.2021, 13:05 [ТС] | |
|
0
|
|
|
Модератор
|
||
| 11.10.2021, 13:09 | ||
|
Или дополнить другим методом. Для WPF нужен ImageSource. Поэтому в задаче надо не поток возвращать, а создавать экземпляр ImageSource из этого потока, замораживать и возвращать его.
1
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 11.10.2021, 20:52 [ТС] | |
|
Сделав кучу тестов на новом, чистом проекте, выяснил, что проблема точно где-то в коде, или подходе его реализации.
Список, с 500 картинками, в тестовом проекте, прогружается за доли секунды без какой-либо виртуализации или способов оптимизации. План исправления следующий: - реализовать новый способ асинхронного отображения картинки в тестовом проекте; - выпилить старую реализацию из проекта, выкинуть её в мусор и заменить новой. Всем огромное спасибо за участие в теме. Много узнал нового. Тема закрыта.
0
|
|
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||||||||||||
| 15.10.2021, 15:21 [ТС] | ||||||||||||||||||||||||||
|
Элд Хасп, сделал всё с нуля в другом, тестовом приложении.
Также хочу подметить, что если не использовать передачу в Dispatcher -- ошибок может не быть, но приложение, порой, работает криво. Поэтому теперь использую всегда. Пример:
Из модели в ViewModel приходит событие добавления в список нового элемента. Во ViewModel'е добавляю так, без await'a:
image.Freeze(); нет в Xamarin и в UWP, по-моему, тоже. Поэтому делаю через await Device.InvokeOnMainThreadAsync
0
|
||||||||||||||||||||||||||
| 15.10.2021, 15:21 | |
|
Данные об отделах ( процент заполения )
Почему CancellationToken не сбрасывает Token Проверка на правильность заполения полей Отправка формы после проверки заполения reCAPTCHA Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|