Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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

Последний раз редактировалось chugada; 31.01.2016 в 21:49.
chugada вне форума Ответить с цитированием
Старый 31.01.2016, 22:12   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Как именно асинхронно? Код покажите.
Не должно ничего замерзать если работа с сокетом не в основном потоке происходит.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 31.01.2016, 22:37   #3
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

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

С сокетами все в порядке. Данные приходят, десериализуються в массив.
Но потом начинаем их в главном отправлять в коллекцию. И вот тут начинаются тормоза.
вот код обновления коллекции
Код:
Dispatcher.BeginInvoke((Action)(() =>
{
                        this.Collection.Clear();

                        foreach (var item in sourсe)
                        {
                            this.Collection.Add(item);
                        }
}));
без этого кода тормозов нет.
Все конвертеры которые могли убрали из xaml и перенесли в инициализацию данных в момент после получения из сокета.
В каждой строке грида есть несколько картинок, ректанглов, и еще всякие контрорлы, все это в соответствующих DataGridTemplateColumn.
chugada вне форума Ответить с цитированием
Старый 31.01.2016, 22:51   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

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

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


Код:
this.Collection = new ObservableCollection<SomeShit>(sourсe);
this.PropertyChanged("Collection");
И лишний BeginInvoke отвалится заодно.
А в гриде у вас виртуализация включена? Если нет, то обязательно включите. Столбцов - по желанию, а строк вот прям обязательно надо
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 31.01.2016, 22:57   #6
chugada
Пользователь
 
Регистрация: 31.01.2016
Сообщений: 17
По умолчанию

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

Цитата:
без этого кода тормозов нет.
Все конвертеры которые могли убрали из xaml и перенесли в инициализацию данных в момент после получения из сокета.
В каждой строке грида есть несколько картинок, ректанглов, и еще всякие контрорлы, все это в соответствующих DataGridTemplateColumn.
А сколько элементов добавляется? Если много (и не тормозит когда мало), то может виртуализация не работает почему-то (EnableRowVirtualization, VirtualizingPanel и т.п.).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 31.01.2016, 23:10   #8
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

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

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

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

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

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

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

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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