В нашем приложении может быть 1K + элементов, передаваемых в DataGrid каждую секунду.
Мы используем UWP DataGrid с открытым исходным кодом из Windows Community Toolkit. Он поддерживается AdvancedCollectionView. Это созвездие действительно, кажется, борется с грузом. Результаты довольно согласуются на нескольких весьма современных машинах, настольных компьютерах и ноутбуках, с 16 ГБ ОЗУ и 8 логическими ядрами.
Было бы неплохо иметь две вещи:
- Весь пользовательский интерфейс всегда достаточно отзывчивый
- Сетка данных может бесперебойно обрабатывать большое количество новых предметов
В настоящее время сетка данных обрабатывает около тысячи новых строк в секунду, но, как следствие, весь пользовательский интерфейс окна запаздывает. Сетка данных, конечно, виртуализирована.
Существует фоновая задача, отвечающая за добавление новых элементов в AdvancedCollectionView с использованием CoreDispatcher, чтобы избежать межпоточного доступа к потоку пользовательского интерфейса:
await CoreDispaptcher.RunIdleAsync(/* synchronous operation */);
Это происходит, когда: а) прошло некоторое время (например, 2 секунды) или, б) было упаковано некоторое количество элементов (например, 250); а-ля Observable.Buffer(250, TimeSpan.FromSeconds(2))
.
Элементы добавляются в AdvancedCollectionView с использованием AdvancedCollectionView.DeferRefresh()
, как рекомендуется при добавлении партии новых элементов.
Удивительно, но CoreDispatcher.RunIdleAsync
работает, даже если поток пользовательского интерфейса на самом деле не так простаивает (IsDispatcherIdle == true
);
У CoreDispatcher
есть средство для очистки очереди сообщений пользовательского интерфейса:
CoreDispatcher.ProcessEvents(CoreProcessEventsOption.ProcessAllIfPresent);
Сначала казалось, что производительность повышается, но затем при работе с подключенным отладчиком всегда возникает исключение. В документации также говорится, что опция CoreProcessEventsOption.ProcessAllIfPresent
должна использоваться с DirectX и C ++.
Видите ли вы что-то, что мы должны сделать или сделать по-другому, чтобы повысить производительность потоковой передачи с помощью этого элемента управления?