我花了一些时间研究和观察最佳实践,以避免在尝试处理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 DataGrid以其性能问题而闻名。您可以尝试通过这个thread的答案。基本上,最推荐的选项是:使用Grid。特别是如果行数千。或者,如果你想保留数据网格,有这样的方法可以减少加载时间
EnableColumnVirtualization = true
EnableRowVirtualization = true
同时设置固定宽度和/或高度,每次更新数据时,datagrid可能会尝试重新计算所需的宽度和高度。我会检查其他线程,以根据您的需要优化您的数据网格。