WPF用大表填充DataGrid阻塞了我的UI线程

时间:2019-03-27 18:35:14

标签: wpf user-interface async-await freeze blocking

我花了一些时间研究和观察最佳实践,以避免在尝试处理UI线程上的数据时阻塞UI线程。具体来说,我会尽可能利用异步/等待。但是,当通过绑定填充DataGrid时,我注意到在命令处理完成并将处理传递回UI后,UI冻结了。

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()”返回时,UI响应大约需要3-5秒。数据可以很好地填充-它需要永远。我不知道这是预期的还是我对此有控制权。

谢谢。

1 个答案:

答案 0 :(得分:1)

WPF DataGrid因其性能问题而闻名。您可以尝试从此thread中获得答案。 基本上,最推荐的选择是:使用网格。特别是如果行数成千上万。 或者,如果您想保留数据网格,可以通过以下方式减少加载时间:

EnableColumnVirtualization = true
EnableRowVirtualization = true

还设置了固定的宽度和/或高度,每次更新数据时,datagrid可能会尝试重新计算所需的宽度和高度。请检查其他线程,以根据需要优化数据网格。