powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как правильно работать с UI?
22 сообщений из 22, страница 1 из 1
Как правильно работать с UI?
    #37341970
Questq2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как правильно работать с UI? Сделали коллекции с уведомлениями об изменениях, сделали привязку. Но ведь любое изменение коллекции должно идти из потока UI. А если коллекий много и они большие? Получается, вся работа будет перекладываться на поток UI?

Или, допустим, если сделать другую коллекцию, не связанную с UI, которую использовать для внесения изменений, а потом приводить состояние забинденной коллекции в состояние идентичности ней, но "уравнивание" содержимого коллекций будет происходить перебором и проверкой на равенство, что будет совсем не быстро.

Как решать эти проблемы? К примеру, биндим грид к Observable Collection на сто тысяч записей, отображаем только последние. Делаем запрос к БД, получаем данные. Теперь надо соединить данные и коллекцию. Что-то выкинуть, что то добавить, что-то оставить без изменений, и при этом неизвестно, что нужно будет отобразить в "видимой" части коллекции. Как тут быть?
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37342007
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Questq2,

Долгие операции с UI нужно разбивать на итерации и выполнять их во время простоя.
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37342009
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Questq2,

Например, как сделан анализ кода в студии.
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37342012
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Questq2,

Но самое главное это показывать прогрес бары, иначе пользователь нервничает =)
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37342031
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руки-крюки,

гг, и нажимает кнопку "Обновить", после чего наступает коллапс
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37342039
Questq2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руки-крюкиQuestq2,

Долгие операции с UI нужно разбивать на итерации и выполнять их во время простоя.

Этот функционал реализует какой-то компонент? Или это надо самому заморачиваться? Можно ссылки или пример?

Грубо говоря, вот есть результаты запроса к БД, 10 тыс записей , а вот есть коллекция на 100 тыс записей, в которую надо эти результата засунуть. Если после запроса в потоке UI делать:

Код: plaintext
1.
foreach (item in query)
    collection. add(item)

то подвешивается UI.
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37342120
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Questq2,

Есть компонент, это обыкновенный dispatcher . Но жаль работает только для WPF (у сильверлайта нет приоритетов у диспетчера).

Еще не забывайте про всякую там виртуализацию, да и теже самые потоки.
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37342158
Questq2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руки-крюки,

1. Проблема не в отрисовке-виртуализации, а в том, что сама по себе операция обновления коллекции, служащей источником данных выполняется долго. Я бы мог использовать распараллеливание обработки коллекции, но у меня же требование - работать только в потоке диспетчера.

2. Как тут использовать потоки? Есть один поток диспетчера, которому маршализуется код обновления коллекции. Он же в одном потоке выполняется?

3. Ну приоритеты дадут, что одна таблица будет обновляться быстрее другой, а другая из-за этого медленнее. А реально-то ускорение разве будет?
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37342348
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Questq2Руки-крюки,

1. Проблема не в отрисовке-виртуализации, а в том, что сама по себе операция обновления коллекции, служащей источником данных выполняется долго. Я бы мог использовать распараллеливание обработки коллекции, но у меня же требование - работать только в потоке диспетчера.

2. Как тут использовать потоки? Есть один поток диспетчера, которому маршализуется код обновления коллекции. Он же в одном потоке выполняется?

3. Ну приоритеты дадут, что одна таблица будет обновляться быстрее другой, а другая из-за этого медленнее. А реально-то ускорение разве будет?

Вы не правильно ставите вопрос. Нужно не ускорение, а увеличение времени отклика интерфейса. Ускорить вы ничего не сможете в любом случае (ускорить в значительной степени). Почитайте что по ссылке находится, там все предельно просто.
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37342409
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Questq2Грубо говоря, вот есть результаты запроса к БД, 10 тыс записей , а вот есть коллекция на 100 тыс записей, в которую надо эти результата засунуть.В очередной раз. Зачем биндить к UI коллекцию со 100 тыс записями? Чё он с ними делать будет?
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37342771
Questq2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руки-крюки, Я понял Ваш намек. Но я этот диспетчер исчитал уже вдоль и поперек. Балансировка нагрузки и все такое... - но у меня весь экран - это постоянно изменяющиеся цифры, десятки отображаемых коллекций

Код: plaintext
1.
Все части работы, которые нет необходимости обрабатывать в потоке пользовательского интерфейса, необходимо вывести в другие потоки для обработки в фоновом режиме.

Ну вот там отличная цитата - только у меня возникает вопрос - а как вынести в другие потоки, если доступ к сущности возможен только из потока диспетчера? Если у меня десять таблиц по 100 тыс записей и все должны обновляться в реалтайме? Что и куда там балансировать?

Алексей К,

Ну я так и понял, что либо я чего-то не знаю (менее вероятно), либо я неправильно использую (более вероятно). Потому как такая насущная проблема полюбому уже должна быть решена на уровне фреймворка.

То есть, предлагаете такое вообще не биндить? Ну а как тогда делать? Положить туда только то, что вмещается на экран? Допустим, но как тогда делают приложения с быстрыми гридами в десятки тысяч записей?

Я правильно понимаю, что самый быстрый способ обновить забинденную и отображаемую коллекцию, это просто проверить знчения ячеек условием на равенство, и если равенства нет - заменить содержимое? У меня варианты с предварительным Clear() (даже на коллекциях в 20 строк) работали медленнее.
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37342940
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Questq2Алексей К,

Ну я так и понял, что либо я чего-то не знаю (менее вероятно), либо я неправильно использую (более вероятно). Потому как такая насущная проблема полюбому уже должна быть решена на уровне фреймворка.

То есть, предлагаете такое вообще не биндить? Ну а как тогда делать? Положить туда только то, что вмещается на экран? Допустим, но как тогда делают приложения с быстрыми гридами в десятки тысяч записей?Дать пользователю возможность фильтрации. При изменении фильтра (нажатии кнопки "Обновить" и т. п.) делать запрос к модели (ваши 100000 записей). Отображать данные, попадающие под введённые критерии фильтра. Подумать о возможности не тянуть много записей из СУБД, а организовать расчёты на уровне SQL.

Questq2Я правильно понимаю, что самый быстрый способ обновить забинденную и отображаемую коллекцию, это просто проверить знчения ячеек условием на равенство, и если равенства нет - заменить содержимое? У меня варианты с предварительным Clear() (даже на коллекциях в 20 строк) работали медленнее.Запросить у модели новую коллекцию для отображения. Заменить старую (ранее забинденную) коллекцию на новую. Можно заменять не всю коллекцию а отдельные записи. В зависимости от потребностей. Получение новой коллекции можно вынести в фоновый поток.
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37343009
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Questq2Допустим, но как тогда делают приложения с быстрыми гридами в десятки тысяч записей?В WPF DataGrid и ListBox имеют виртуализацию записей. Просчитываются только отображаемые на экране элементы. Но, зачастую, особенно в DataGrid, отображаемых на экране элементов хватает для тормозов. Т. е. тормоза DataGrid не зависят от количества записей в исходном наборе данных. Можно попробовать установить фиксированную ширину колонок и высоту строк. Возможно поможет.
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37343642
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Questq2,

чтобы работать в фоне (если мы говорим про Silverlight), то можно использовать BackgroundWorker.
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37344049
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уТКа,
может это поможет
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37344053
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708,
извини

ссылка
wpf
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37344189
Questq2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Я попробую каждый раз создавать новую коллекцию и биндить, но звучит зловеще...

уТКа,

Насколько я понял, BackgroundWorker это что-то типа удобной возможности юзать многопоточность в приложениях WPF. А у меня и так рабочие потоки есть, и проблема в том, как менять коллекции, если они уже забиндены и отображены, а значит должны меняться только в потоке UI. Или, из потока UI можно через BackgroundWorker скинуть изменение в новый поток и не получить ошибку, что "коллекция была изменена и т.д."? То есть, может ли BackgroundWorker безопасно работать с сущностями, принадлежащими потоку диспетчера?
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37344288
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не может. Меняйте концепцию.Вся обработка на сервере, а на клиенте только нужные данные. Пытаться переварить на клиенте 1000К - маразм
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37344413
Questq2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeVa,

Ну как маразм? Для веба может и маразм. А Вы видели терминалы биржевые? Таблица сделок - 500-700 тыс записей в день, куча рабочих столов в терминале, любые фильтры достаточно быстро. И все в терминале, все на клиенте, свободно прокручивается, ничего не тормозит, реалтайм, совпадает по времени с другими поставщиками данных... - сделали же? сделали, и не один такой терминал... ...а Вы - "меняйте концепцию"... ...поменял бы, если б не видел, что другие-то могут. Они, понятно, вопросов на форумах не задают, конечно...
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37344437
.ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeVaНе может. Меняйте концепцию.Вся обработка на сервере, а на клиенте только нужные данные. Пытаться переварить на клиенте 1000К - маразм
зевая...
На современных клиентах можно термоядерные реакции считать... в реальном времени...
В плюшевом смартфоне процессор мощнее, чем в каком-нибудь энтерпрайз-серваке пятнадцать лет назад... и памяти побольше.
А вы тут на какие-то 1000К чего-то пытаетесь концепцию натянуть... прикрывая чью-то (совершеннейший нефакт что свою) задорукость...
хррр...

в то время, как... наши космические корабли...
бороздят... просторы тихого океана...
эта...
хррр...
коробочка...
тормозит при выделении слова цветом в ворде...
бум
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37344448
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Questq2SeVa,

Ну как маразм? Для веба может и маразм. А Вы видели терминалы биржевые? Таблица сделок - 500-700 тыс записей в день, куча рабочих столов в терминале, любые фильтры достаточно быстро. И все в терминале, все на клиенте, свободно прокручивается, ничего не тормозит, реалтайм, совпадает по времени с другими поставщиками данных... - сделали же? сделали, и не один такой терминал... ...а Вы - "меняйте концепцию"... ...поменял бы, если б не видел, что другие-то могут. Они, понятно, вопросов на форумах не задают, конечно...

Мда, терминалы биржевиков - особый случай. Тогда вам нужна своя реализация виртуальной коллекции с интерфейсом ICollectionView.
SourceCollection - исходная, которую можно поддерживать в отдельном потоке, при ее обновлении, выдавать более гранулированные сообщения об изменении(только те, что попадают в текущее виртуальное окно), а не тупо Reset.
Чтобы не ковырятся грязными руками в чужом носу по-напрасну, посмотрите как летают корабли у других(VirtualCollection от Infragistics - весьма навороченный вариант с кэшированием и тд) и допилите их под себя.
...
Рейтинг: 0 / 0
Как правильно работать с UI?
    #37344740
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЛПНа современных клиентах можно термоядерные реакции считать... в реальном времени...
В плюшевом смартфоне процессор мощнее, чем в каком-нибудь энтерпрайз-серваке пятнадцать лет назад... и памяти побольше.
А вы тут на какие-то 1000К чего-то пытаетесь концепцию натянуть... прикрывая чью-то (совершеннейший нефакт что свою) задорукость...Тонким местом может стать передача данных по СПД. Хотя, если СПД такая же сверхбыстрая и сверхнадёжная как у биржевых терминалов - почему бы и нет. Подписываемся на какую-нибудь очередь аля MSMQ и вперёд. Если чё сломается - валим всё на сетевых админов.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как правильно работать с UI?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]