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

标签 wpf user-interface async-await freeze blocking

我花了一些时间研究和观察最佳实践,以避免在尝试处理 UI 线程上的数据时阻塞 UI 线程。具体来说,我尽可能地利用 async/await。但是,当通过绑定(bind)填充 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();
}

我已经单步执行代码来观察处理时间,放置调试器消息并且处理似乎正常。 wait 语句大约需要 1.5 秒,最后的网格处理需要几毫秒。然而,当我从“CommandExecute()”返回时,UI 大约需要 3-5 秒才能响应。数据填充得很好——只是需要很长时间。我不知道这是否是预期的,也不知道我是否可以控制它。

谢谢。

最佳答案

WPF DataGrid 以其性能问题而闻名。您可以尝试查看此thread中的答案。 基本上,最推荐的选项是:使用网格。特别是当行数达到数千时。 或者,如果您想保留数据网格,可以通过以下方法来减少加载时间

EnableColumnVirtualization = true
EnableRowVirtualization = true

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

关于WPF 用大表填充 DataGrid 阻塞了我的 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55384325/

相关文章:

c# - 在 WPF 的自定义 main() 中获取对 MainWindow 的引用

android - 更新旧的android项目

java - 如何在没有 App 服务器和 Web 服务器的情况下从 UI 调用 shell 脚本?

javascript - 编写 koa 异步函数中间件时出错

c# - 什么时候等待动态调用的方法?

wpf - 分组会阻碍虚拟化吗?

c# - 使用 CollectionViewSource 在数据网格上进行分组的问题

c# - WPF 资源覆盖

java - 在控制台模式和图形模式之间切换

python-3.x - 如何使用 asyncio 优雅地超时