代码之家  ›  专栏  ›  技术社区  ›  Femaref

为数据报行创建可视容器时应用程序冻结

  •  0
  • Femaref  · 技术社区  · 14 年前

    我目前正在解决一个问题,在过去的几周左右,我一直在解决这个问题。

    这不是一个可以通过多线程解决的正常冻结问题,因为我已经在为业务逻辑做这件事了。

    我有一个带有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线程,整个应用程序冻结。你以前遇到过这个问题吗?你是怎么解决的?还是我真的走运了?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Femaref    14 年前

    CollectionViewSource GroupTemplate