Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 31.01.2016, 22:46   #1
chugada
Пользователь
 
Регистрация: 31.01.2016
Сообщений: 17
Репутация: 10
Вопрос wpf: обновление гуи

В окне находится DataGrid (не принципиально).
Данные в него приходят асинхронно из сокета. Интрвал примерно 5 сек +- 1 сек. При этом весь гуи "замерзает".
Что можно сделать чтобы человек не ощущал этих тормозов?
Другой контрол или как-то по хитрому обновлять?

Сейчас данные биндятся по средствам ObservableCollection.

Последний раз редактировалось chugada; 31.01.2016 в 22:49.
chugada вне форума   Ответить с цитированием
Старый 31.01.2016, 23:12   #2
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,382
Репутация: 3353

icq: 512-765
skype: alexp.frl
По умолчанию

Как именно асинхронно? Код покажите.
Не должно ничего замерзать если работа с сокетом не в основном потоке происходит.
Alex11223 на форуме   Ответить с цитированием
Старый 31.01.2016, 23:37   #3
come-on
Профессионал
 
Регистрация: 21.10.2015
Сообщений: 1,414
Репутация: 414
По умолчанию

deleteet
come-on вне форума   Ответить с цитированием
Старый 31.01.2016, 23:38   #4
chugada
Пользователь
 
Регистрация: 31.01.2016
Сообщений: 17
Репутация: 10
По умолчанию

С сокетами все в порядке. Данные приходят, десериализуються в массив.
Но потом начинаем их в главном отправлять в коллекцию. И вот тут начинаются тормоза.
вот код обновления коллекции
Код:

Dispatcher.BeginInvoke((Action)(() =>
{
                        this.Collection.Clear();

                        foreach (var item in sourсe)
                        {
                            this.Collection.Add(item);
                        }
}));

без этого кода тормозов нет.
Все конвертеры которые могли убрали из xaml и перенесли в инициализацию данных в момент после получения из сокета.
В каждой строке грида есть несколько картинок, ректанглов, и еще всякие контрорлы, все это в соответствующих DataGridTemplateColumn.
chugada вне форума   Ответить с цитированием
Старый 31.01.2016, 23:51   #5
Luuzuk
Участник клуба
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Адрес: Самара
Сообщений: 975
Репутация: 605

icq: З7ЧЗЗ89Ч5
По умолчанию

При каждом "Collection.Add(item);" вызывается NotifyCollectionChanged, который скорости вашему приложению явно не добавляет ))

Коллекцию надо менять целиком, а потом вызывать this.PropertyChanged("Collection")


Код:

this.Collection = new ObservableCollection<SomeShit>(sourсe);
this.PropertyChanged("Collection");

И лишний BeginInvoke отвалится заодно.
А в гриде у вас виртуализация включена? Если нет, то обязательно включите. Столбцов - по желанию, а строк вот прям обязательно надо
__________________
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума   Ответить с цитированием
Старый 31.01.2016, 23:57   #6
chugada
Пользователь
 
Регистрация: 31.01.2016
Сообщений: 17
Репутация: 10
По умолчанию

про NotifyCollectionChanged понятно, пробовали и пересоздавать коллекцию, но результат тотже. Тормоза именно при обновлении самого грида.
По поводу виртуализации, по умолчанию она уже включена если справка не врет или ее еще както надо ососбо настроить?
chugada вне форума   Ответить с цитированием
Старый 31.01.2016, 23:59   #7
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,382
Репутация: 3353

icq: 512-765
skype: alexp.frl
По умолчанию

Цитата:
без этого кода тормозов нет.
Все конвертеры которые могли убрали из xaml и перенесли в инициализацию данных в момент после получения из сокета.
В каждой строке грида есть несколько картинок, ректанглов, и еще всякие контрорлы, все это в соответствующих DataGridTemplateColumn.
А сколько элементов добавляется? Если много (и не тормозит когда мало), то может виртуализация не работает почему-то (EnableRowVirtualization, VirtualizingPanel и т.п.).
Alex11223 на форуме   Ответить с цитированием
Старый 01.02.2016, 00:10   #8
Luuzuk
Участник клуба
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Адрес: Самара
Сообщений: 975
Репутация: 605

icq: З7ЧЗЗ89Ч5
По умолчанию

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

Все равно уберите ужасный код с добавлением элементов поштучно и пересоздавайте коллекцию целиком

Цитата:
по умолчанию она уже включена если справка не врет или ее еще както надо ососбо настроить?
Скачать WpfInspector и посмотреть количество элементов в визуальном дереве грида, так вы гарантированно узнаете включена она, или нет

Цитата:
В каждой строке грида есть несколько картинок
Картинки фризятся? В этом тоже есть кучка подводных камней, которые и производительность и память могут оккупировать айда-ушел )

-----
Можно, конечно, лечить симптомы (асинхроный инвок в UI через диспетчер или IsAsync=true в биндинге), но это неправильный подход, вы и сами это прекрасно понимаете
__________________
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 01.02.2016 в 00:14.
Luuzuk вне форума   Ответить с цитированием
Старый 01.02.2016, 00:13   #9
chugada
Пользователь
 
Регистрация: 31.01.2016
Сообщений: 17
Репутация: 10
По умолчанию

Цитата:
А сколько элементов добавляется?
Да в том то и дело что с одной стороны их не так и много от 20 до 100, настраивает пользователь, но с другой кто его знает. Тормоза даже при 20 ощутимы.
В общем каждый item это объект и у которого есть еще своя внутренняя коллекция, в паре колонок есть еще свой "проход" по этой внутренней коллекции. Там элементов или 2 или 3, не больше не меньше.

Цитата:
Все равно уберите ужасный код с добавлением элементов поштучно и пересоздавайте коллекцию целиком
да это просто пытки попытки, изначально пересоздавали, но потом стали искрить ..
chugada вне форума   Ответить с цитированием
Старый 01.02.2016, 00:16   #10
Luuzuk
Участник клуба
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Адрес: Самара
Сообщений: 975
Репутация: 605

icq: З7ЧЗЗ89Ч5
По умолчанию

Блин, самый главный вопрос забыл... А профайлер запускали?
__________________
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C# + WPF] Отлов нажатий клавиш, хуки, горячие клавиши в проекте WPF Casper-SC WPF, UWP, WinRT, XAML 3 03.03.2017 16:00
КАк создать ГУИ интерфейс без среды? Алексей_2012 Общие вопросы C/C++ 5 12.01.2016 08:20
Обновление таблицы БД SqlLite - C# WPF Notan1310 WPF, UWP, WinRT, XAML 4 08.10.2015 15:34
WPF/ Обновление ItemsSource-а ShoGUN WPF, UWP, WinRT, XAML 0 02.06.2014 18:34


10:56.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru