我目前正在解决一个问题,在过去的几周左右,我一直在解决这个问题。
这不是一个可以通过多线程解决的正常冻结问题,因为我已经在为业务逻辑做这件事了。
我有一个带有DataGrid的视图,DataContext是一个提供
ObservableCollection<T>
到A
CollectionViewSource
命名
iGroupingJournal
.
<DataGrid Grid.Row="1" ItemsSource="{Binding Source={StaticResource iGroupedJournal}}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=DateTime}" Header="DateTime" />
[...]
</DataGrid.Columns>
</DataGrid>
通常,会显示大约50行,其中有7列,这会导致应用程序在生成这些行时冻结。
我已经排除了以下原因:
1.1。产生开销的复杂业务类—使用数据保持类进行测试,不会提高速度
1.2。昂贵的数据库查询在GUI线程中执行,这是因为通过LINQ获取数据->通过caling在workerthread中获取数据
ToList
并将数据映射到上述持有类
1.3。集合分组增加了开销->删除了
集合视图源
.
测试或思考以下内容:
2.1。通过删除分组指令测试了用户界面的虚拟化,没有任何效果,分组也是一个值得期待的特性。
2.2。数据虚拟化-不会有效果,因为通常要创建50行
结论
我尽我所能从GUI线程中获取工作,并且当WorkerThread发送时,通过一个loadingIndicator可以清楚地看到它。
NotifyCollectionChanged
对于GUI线程,整个应用程序冻结。你以前遇到过这个问题吗?你是怎么解决的?还是我真的走运了?