Оптимизация DataGrid для Windows Community Toolkit для потоковой передачи - PullRequest
0 голосов
/ 13 апреля 2019

В нашем приложении может быть 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 ++.

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

...