WPF заполняет DataGrid большой таблицей, блокирующей мой поток пользовательского интерфейса - PullRequest
0 голосов
/ 27 марта 2019

Я потратил некоторое время на изучение и изучение лучших практик, чтобы избежать блокировки потока пользовательского интерфейса при попытке обработки данных в потоке пользовательского интерфейса.В частности, я использую async / await, где могу.Однако при заполнении DataGrid через Binding я заметил, что мой пользовательский интерфейс зависает после завершения обработки команды, и обработка передается обратно в пользовательский интерфейс.

XAML

<DataGrid ItemsSource="{Binding EndpointModel.DataView}"
          AutoGenerateColumns="True" IsReadOnly="True">            
</DataGrid>

Выполнение команды DataModel:

public async void CommandExecute()
{
    ...

    JsonData = await accessor.GetDataAsync(new Endpoint.Params().Universe(universe)
                                                                .WithStart(start)
                                                                .WithEnd(end));

    // Creates a very large DataTable within my display (30 x 350)
    var grid = EndpointModel.CreateDataGrid(JsonData);      
    EndpointModel.DataView = grid.AsDataView();
}

Я прошел по коду для наблюдения за временем обработки, помещенные сообщения отладчика и обработка кажутся нормальными.Оператор ожидания занимает около 1,5 секунд, а обработка сетки в конце занимает несколько мс.Тем не менее, когда я возвращаюсь из CommandExecute (), требуется около 3-5 секунд, прежде чем пользовательский интерфейс реагирует.Данные заполняются хорошо - это просто навсегда.Я не знаю, ожидается ли это или я контролирую это.

спасибо.

1 Ответ

1 голос
/ 28 марта 2019

WPF DataGrid известен своими проблемами с производительностью. Вы можете попытаться просмотреть ответы из этой темы . В основном, наиболее рекомендуемый вариант: использование Grid. Особенно, если ряды насчитывают тысячи. Или, если вы хотите сохранить сетку данных, есть такие способы уменьшить время загрузки, как

EnableColumnVirtualization = true
EnableRowVirtualization = true

Также установите фиксированную ширину и / или высоту, сетка данных может попытаться пересчитать требуемую ширину и высоту каждый раз, когда обновляются данные. Я бы проверил другие темы, чтобы оптимизировать сетку данных под ваши нужды.

...