【问题标题】:Datagrid binding (WPF) causing UI delay数据网格绑定 (WPF) 导致 UI 延迟
【发布时间】:2011-03-02 23:07:41
【问题描述】:

我希望能够快速将项目添加到数据网格而不会导致 UI 延迟。

这是我现在正在做的事情: 我正在使用绑定到数据网格的 ObservableCollection。

我使用一个后台线程,该线程仅在从可观察集合中插入/删除时循环并调用当前调度程序上的 Invoke。相反,调用 BeginInvoke 会产生不良结果。

我知道在调度程序上调用这么多会导致延迟,但我不知道还能做什么。我以前使用过后台工作人员,但我认为这不适用于我的场景。

我可以做些什么来保持 UI 响应?

【问题讨论】:

  • 您的收藏包含多少项目,您要添加多少项目?插入之后是否还有其他代码(例如 CollectionChanged 处理,或在绑定项目时运行的代码)?
  • 集合从 0 项开始,每次添加一项。如果超过 10 个,则将删除一个。当我每秒添加大约 100 个项目时,用户界面会滞后。如果集合中的项目超过 10 个,则插入后除了删除之外没有额外的代码。

标签: c# wpf multithreading dispatcher


【解决方案1】:

批量更新——后台线程可以将项目添加到队列中,您可以通过调用定期刷新绑定的可观察集合。如果您需要处理多线程生产者,请查看 System.Collections.Concurrent 命名空间

【讨论】:

  • System.Collections.Concurrent 仅在 .NET 4 FWIW 中可用
【解决方案2】:

您的设计中的一个主要弱点是,通过绑定到 ObservableCollection,您会导致 UI 呈现添加到列表中的每个项目(可能是数千个) - 即使在处理结束时只有 10 个项目需要渲染。

通过将 ObservableCollection 更改为 List,并在处理结束时手动刷新 DataGrid,我看到了巨大的改进——这样 UI 只需要处理 10 个项目。我发现此更改导致 50% 的性能提升,并允许 UI 在处理列表时 100% 响应。

如果您长时间处理列表,并且需要显示实时更改,您可以每 100 个项目刷新一次 DataGrid。这将显示大约 0.5 秒精度的结果,应该足够接近。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 2014-05-24
    • 2011-09-28
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多