我目前正在处理一个问题,这个问题让我在过去几周左右的脚趾。
这不是多线程可解决的正常冻结问题,因为我已经为业务逻辑做了这个。
我有一个带有DataGrid的View,DataContext是一个ViewModel,为名为ObservableCollection<T>
的{{1}}提供CollectionViewSource
。
iGroupingJournal
通常,显示大约50行有7列,这会导致应用程序在生成这些行时冻结。
我已经排除了以下原因:
1.1。复杂的商业类产生开销 - &gt;使用数据保持类测试,不会产生速度增加
1.2。由于通过LINQ获取数据,因此在gui线程中执行昂贵的数据库查询 - &gt;通过调用<DataGrid Grid.Row="1" ItemsSource="{Binding Source={StaticResource iGroupedJournal}}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=DateTime}" Header="DateTime" />
[...]
</DataGrid.Columns>
</DataGrid>
并将数据映射到前面提到的持有类,可以在workerthread中获取数据
1.3。集合分组增加了开销 - &gt;删除了ToList
中的分组标题。
以下测试或考虑过:
2.1。通过删除分组指令测试UI虚拟化,没有任何影响,分组也是一个可取的功能
2.2。数据虚拟化 - 不会产生影响,因为必须创建50行,这是通常显示的
结论
我尽我所能将工作从GUI线程中解脱出来,并且LoadingIndicator清楚地看到,当workerthread将CollectionViewSource
发送到GUI线程时,整个应用程序冻结。你以前遇到过这个问题吗?你是怎么解决的?或者我真的不走运?
答案 0 :(得分:0)
原因是分组。我想我可以删除CollectionViewSource
中的群组,但情况并非如此 - 我还需要移除GroupTemplate
。