|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Как правильно работать с UI? Сделали коллекции с уведомлениями об изменениях, сделали привязку. Но ведь любое изменение коллекции должно идти из потока UI. А если коллекий много и они большие? Получается, вся работа будет перекладываться на поток UI? Или, допустим, если сделать другую коллекцию, не связанную с UI, которую использовать для внесения изменений, а потом приводить состояние забинденной коллекции в состояние идентичности ней, но "уравнивание" содержимого коллекций будет происходить перебором и проверкой на равенство, что будет совсем не быстро. Как решать эти проблемы? К примеру, биндим грид к Observable Collection на сто тысяч записей, отображаем только последние. Делаем запрос к БД, получаем данные. Теперь надо соединить данные и коллекцию. Что-то выкинуть, что то добавить, что-то оставить без изменений, и при этом неизвестно, что нужно будет отобразить в "видимой" части коллекции. Как тут быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2011, 18:51 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Questq2, Долгие операции с UI нужно разбивать на итерации и выполнять их во время простоя. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2011, 19:34 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Questq2, Например, как сделан анализ кода в студии. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2011, 19:34 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Questq2, Но самое главное это показывать прогрес бары, иначе пользователь нервничает =) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2011, 19:36 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Руки-крюки, гг, и нажимает кнопку "Обновить", после чего наступает коллапс ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2011, 19:54 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Руки-крюкиQuestq2, Долгие операции с UI нужно разбивать на итерации и выполнять их во время простоя. Этот функционал реализует какой-то компонент? Или это надо самому заморачиваться? Можно ссылки или пример? Грубо говоря, вот есть результаты запроса к БД, 10 тыс записей , а вот есть коллекция на 100 тыс записей, в которую надо эти результата засунуть. Если после запроса в потоке UI делать: Код: plaintext 1.
то подвешивается UI. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2011, 20:01 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Questq2, Есть компонент, это обыкновенный dispatcher . Но жаль работает только для WPF (у сильверлайта нет приоритетов у диспетчера). Еще не забывайте про всякую там виртуализацию, да и теже самые потоки. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2011, 21:15 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Руки-крюки, 1. Проблема не в отрисовке-виртуализации, а в том, что сама по себе операция обновления коллекции, служащей источником данных выполняется долго. Я бы мог использовать распараллеливание обработки коллекции, но у меня же требование - работать только в потоке диспетчера. 2. Как тут использовать потоки? Есть один поток диспетчера, которому маршализуется код обновления коллекции. Он же в одном потоке выполняется? 3. Ну приоритеты дадут, что одна таблица будет обновляться быстрее другой, а другая из-за этого медленнее. А реально-то ускорение разве будет? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2011, 21:44 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Questq2Руки-крюки, 1. Проблема не в отрисовке-виртуализации, а в том, что сама по себе операция обновления коллекции, служащей источником данных выполняется долго. Я бы мог использовать распараллеливание обработки коллекции, но у меня же требование - работать только в потоке диспетчера. 2. Как тут использовать потоки? Есть один поток диспетчера, которому маршализуется код обновления коллекции. Он же в одном потоке выполняется? 3. Ну приоритеты дадут, что одна таблица будет обновляться быстрее другой, а другая из-за этого медленнее. А реально-то ускорение разве будет? Вы не правильно ставите вопрос. Нужно не ускорение, а увеличение времени отклика интерфейса. Ускорить вы ничего не сможете в любом случае (ускорить в значительной степени). Почитайте что по ссылке находится, там все предельно просто. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2011, 01:41 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Questq2Грубо говоря, вот есть результаты запроса к БД, 10 тыс записей , а вот есть коллекция на 100 тыс записей, в которую надо эти результата засунуть.В очередной раз. Зачем биндить к UI коллекцию со 100 тыс записями? Чё он с ними делать будет? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2011, 06:27 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Руки-крюки, Я понял Ваш намек. Но я этот диспетчер исчитал уже вдоль и поперек. Балансировка нагрузки и все такое... - но у меня весь экран - это постоянно изменяющиеся цифры, десятки отображаемых коллекций Код: plaintext 1.
Ну вот там отличная цитата - только у меня возникает вопрос - а как вынести в другие потоки, если доступ к сущности возможен только из потока диспетчера? Если у меня десять таблиц по 100 тыс записей и все должны обновляться в реалтайме? Что и куда там балансировать? Алексей К, Ну я так и понял, что либо я чего-то не знаю (менее вероятно), либо я неправильно использую (более вероятно). Потому как такая насущная проблема полюбому уже должна быть решена на уровне фреймворка. То есть, предлагаете такое вообще не биндить? Ну а как тогда делать? Положить туда только то, что вмещается на экран? Допустим, но как тогда делают приложения с быстрыми гридами в десятки тысяч записей? Я правильно понимаю, что самый быстрый способ обновить забинденную и отображаемую коллекцию, это просто проверить знчения ячеек условием на равенство, и если равенства нет - заменить содержимое? У меня варианты с предварительным Clear() (даже на коллекциях в 20 строк) работали медленнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2011, 10:58 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Questq2Алексей К, Ну я так и понял, что либо я чего-то не знаю (менее вероятно), либо я неправильно использую (более вероятно). Потому как такая насущная проблема полюбому уже должна быть решена на уровне фреймворка. То есть, предлагаете такое вообще не биндить? Ну а как тогда делать? Положить туда только то, что вмещается на экран? Допустим, но как тогда делают приложения с быстрыми гридами в десятки тысяч записей?Дать пользователю возможность фильтрации. При изменении фильтра (нажатии кнопки "Обновить" и т. п.) делать запрос к модели (ваши 100000 записей). Отображать данные, попадающие под введённые критерии фильтра. Подумать о возможности не тянуть много записей из СУБД, а организовать расчёты на уровне SQL. Questq2Я правильно понимаю, что самый быстрый способ обновить забинденную и отображаемую коллекцию, это просто проверить знчения ячеек условием на равенство, и если равенства нет - заменить содержимое? У меня варианты с предварительным Clear() (даже на коллекциях в 20 строк) работали медленнее.Запросить у модели новую коллекцию для отображения. Заменить старую (ранее забинденную) коллекцию на новую. Можно заменять не всю коллекцию а отдельные записи. В зависимости от потребностей. Получение новой коллекции можно вынести в фоновый поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2011, 12:05 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Questq2Допустим, но как тогда делают приложения с быстрыми гридами в десятки тысяч записей?В WPF DataGrid и ListBox имеют виртуализацию записей. Просчитываются только отображаемые на экране элементы. Но, зачастую, особенно в DataGrid, отображаемых на экране элементов хватает для тормозов. Т. е. тормоза DataGrid не зависят от количества записей в исходном наборе данных. Можно попробовать установить фиксированную ширину колонок и высоту строк. Возможно поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2011, 12:25 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Questq2, чтобы работать в фоне (если мы говорим про Silverlight), то можно использовать BackgroundWorker. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2011, 15:42 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
уТКа, может это поможет ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2011, 18:55 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Алексей К, Я попробую каждый раз создавать новую коллекцию и биндить, но звучит зловеще... уТКа, Насколько я понял, BackgroundWorker это что-то типа удобной возможности юзать многопоточность в приложениях WPF. А у меня и так рабочие потоки есть, и проблема в том, как менять коллекции, если они уже забиндены и отображены, а значит должны меняться только в потоке UI. Или, из потока UI можно через BackgroundWorker скинуть изменение в новый поток и не получить ошибку, что "коллекция была изменена и т.д."? То есть, может ли BackgroundWorker безопасно работать с сущностями, принадлежащими потоку диспетчера? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2011, 21:18 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Не может. Меняйте концепцию.Вся обработка на сервере, а на клиенте только нужные данные. Пытаться переварить на клиенте 1000К - маразм ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2011, 23:38 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
SeVa, Ну как маразм? Для веба может и маразм. А Вы видели терминалы биржевые? Таблица сделок - 500-700 тыс записей в день, куча рабочих столов в терминале, любые фильтры достаточно быстро. И все в терминале, все на клиенте, свободно прокручивается, ничего не тормозит, реалтайм, совпадает по времени с другими поставщиками данных... - сделали же? сделали, и не один такой терминал... ...а Вы - "меняйте концепцию"... ...поменял бы, если б не видел, что другие-то могут. Они, понятно, вопросов на форумах не задают, конечно... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2011, 01:57 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
SeVaНе может. Меняйте концепцию.Вся обработка на сервере, а на клиенте только нужные данные. Пытаться переварить на клиенте 1000К - маразм зевая... На современных клиентах можно термоядерные реакции считать... в реальном времени... В плюшевом смартфоне процессор мощнее, чем в каком-нибудь энтерпрайз-серваке пятнадцать лет назад... и памяти побольше. А вы тут на какие-то 1000К чего-то пытаетесь концепцию натянуть... прикрывая чью-то (совершеннейший нефакт что свою) задорукость... хррр... в то время, как... наши космические корабли... бороздят... просторы тихого океана... эта... хррр... коробочка... тормозит при выделении слова цветом в ворде... бум ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2011, 02:39 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
Questq2SeVa, Ну как маразм? Для веба может и маразм. А Вы видели терминалы биржевые? Таблица сделок - 500-700 тыс записей в день, куча рабочих столов в терминале, любые фильтры достаточно быстро. И все в терминале, все на клиенте, свободно прокручивается, ничего не тормозит, реалтайм, совпадает по времени с другими поставщиками данных... - сделали же? сделали, и не один такой терминал... ...а Вы - "меняйте концепцию"... ...поменял бы, если б не видел, что другие-то могут. Они, понятно, вопросов на форумах не задают, конечно... Мда, терминалы биржевиков - особый случай. Тогда вам нужна своя реализация виртуальной коллекции с интерфейсом ICollectionView. SourceCollection - исходная, которую можно поддерживать в отдельном потоке, при ее обновлении, выдавать более гранулированные сообщения об изменении(только те, что попадают в текущее виртуальное окно), а не тупо Reset. Чтобы не ковырятся грязными руками в чужом носу по-напрасну, посмотрите как летают корабли у других(VirtualCollection от Infragistics - весьма навороченный вариант с кэшированием и тд) и допилите их под себя. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2011, 08:03 |
|
Как правильно работать с UI?
|
|||
---|---|---|---|
#18+
.ЛПНа современных клиентах можно термоядерные реакции считать... в реальном времени... В плюшевом смартфоне процессор мощнее, чем в каком-нибудь энтерпрайз-серваке пятнадцать лет назад... и памяти побольше. А вы тут на какие-то 1000К чего-то пытаетесь концепцию натянуть... прикрывая чью-то (совершеннейший нефакт что свою) задорукость...Тонким местом может стать передача данных по СПД. Хотя, если СПД такая же сверхбыстрая и сверхнадёжная как у биржевых терминалов - почему бы и нет. Подписываемся на какую-нибудь очередь аля MSMQ и вперёд. Если чё сломается - валим всё на сетевых админов. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2011, 18:06 |
|
|
start [/forum/topic.php?fid=21&msg=37342031&tid=1442249]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 150ms |
0 / 0 |