我目前正在研究一個問題,它讓我在最後幾周左右的腳趾上。爲DataGrid行創建可視容器時凍結應用程序
這不是一個可以通過多線程解決的正常凍結問題,因爲我已經在爲業務邏輯執行此操作。
我有一個DataGrid查看,DataContext是一個ViewModel提供ObservableCollection<T>
到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 ToList
並將數據映射到前述保持類
1.3在的WorkerThread取出。收集分組會增加開銷 - >刪除CollectionViewSource
中的分組標題。
下進行測試或想到:
2.1。通過刪除分組指令測試UI虛擬化沒有任何影響,分組也是一個需要的功能
2.2。數據虛擬化 - 會不會有效果,因爲50行必須創建爲這就是通常顯示
結論
我做了所有我能得到的工作出了GUI線程,而且它顯然一個LoadingIndicator可以看出,當工作線程發送NotifyCollectionChanged
到GUI線程時,整個應用程序就會凍結。你以前遇到過這個問題嗎?你是如何解決它的?或者我真的運氣不好?