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

问题描述 投票:0回答:1

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

我已经通过代码来观察处理时间,放置调试器消息和处理似乎正常。 await语句大约需要1.5秒,最后的网格处理时间为几毫秒。然而,当我从'CommandExecute()'返回时,在UI响应之前大约需要3-5秒。数据填充得很好 - 它只需要永远。我不知道这是否是预期的,或者我是否能够控制这一点。

谢谢。

wpf user-interface async-await freeze blocking
1个回答
1
投票

WPF DataGrid以其性能问题而闻名。您可以尝试通过这个thread的答案。基本上,最推荐的选项是:使用Grid。特别是如果行数千。或者,如果你想保留数据网格,有这样的方法可以减少加载时间

EnableColumnVirtualization = true
EnableRowVirtualization = true

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

© www.soinside.com 2019 - 2024. All rights reserved.