我花了一些时间研究和观察最佳实践,以避免在尝试处理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秒。数据可以很好地填充-它需要永远。我不知道这是预期的还是我对此有控制权。
谢谢。
答案 0 :(得分:1)
WPF DataGrid因其性能问题而闻名。您可以尝试从此thread中获得答案。 基本上,最推荐的选择是:使用网格。特别是如果行数成千上万。 或者,如果您想保留数据网格,可以通过以下方式减少加载时间:
EnableColumnVirtualization = true
EnableRowVirtualization = true
还设置了固定的宽度和/或高度,每次更新数据时,datagrid可能会尝试重新计算所需的宽度和高度。请检查其他线程,以根据需要优化数据网格。