如何在不锁定 GUI 的情况下将数千个项目添加到绑定集合中

2024-01-27

我有一个设置,其中可能有数千个项目(认为 3000-5000 个)将添加到ObservableCollection绑定到一些可视化界面。目前,添加它们的过程非常慢(大约 4 秒/1000 个项目),当然 GUI 在此期间没有响应。有什么好方法可以一次性将这么多项目移动到集合中而不用担心系统锁定?我看过DispatcherTimer但我不确定它是否能提供我需要的一切。

另一个问题 - 我可以做些什么来加快这些对象的创建速度,这样就不需要花很长时间将它们添加到集合中?目前我像这样使用它们:Collection.Add(new Item(<params>))在后台线程中预先生成这些项目可能会显着减少添加它们所需的时间吗?

编辑:虚拟化是不可能的。要求指定了WrapPanel看,所以显示器实际上是一个ListBox其中有一个模板化的 ItemsPanel

Edit2:根据秒表,瓶颈实际上是将项目放入我的ObservableCollection。我将尝试更改该集合类型并执行我自己的通知,看看是否会显着加快速度。

Edit3:所以答案就在一个地方 - 我通过创建一个继承自的类解决了这个问题(在下面的帮助下)ObservableCollection。这个类做了两件事 - 公开一种一次性添加集合的方法,并添加了抑制CollectionChanged事件。通过这些更改,添加 3000 个项目所需的时间大约为 0.4 秒(改进了 97%)。This http://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/链接详细介绍了这些更改的实施。


你说的是 1000,所以我就以这个数字为例。

IIRC,可观察集合有一个小缺点 - 如果您逐个添加项目,它会为每个项目引发一次通知。这意味着您有 1000 个项目的 1000 个通知,并且 UI 线程将以致命的速度运行,只是为了跟上屏幕的重绘。

需要尽快重画吗?也许你可以批量添加?将 1000 件物品分成几包,每包 100 件,或多包,每包 50 件或 20 件。然后,不要将所有物品一件一件地放入,而是将它们放入包装袋中。但要注意:您必须使用集合本身实现的 AddRange 等方法,而不是 LINQ,否则您将再次进行一对一插入。如果您找到这样的方法,它应该会显着减少事件的数量,因为集合应该在每次 AddRange 调用时仅引发一次 Changed 事件。

如果可观察集合没有 AddRange,要么使用不同的集合,要么编写自己的集合,仅一个包装器可能就足够了。目标是不在每个 Add() 处引发 Changed 事件,而是在合理计数之后引发 Changed 事件,或者 - 也许只是在添加项目时跳过引发 Changed 事件并在某些固定时间间隔引发 Changed 事件?如果您的数据以恒定速率无限期地“流入”,这将特别有益。

当然,当屏幕上出现如此多的项目时,您可能还得专注于渲染它本身。如果您的 ItemTemplate 很复杂,则 1000 个对象乘以 1000 个可视层/属性实例可能会破坏用户体验。您是否已将 ItemTemplate 简化到最低限度?

最后一件事:考虑使用虚拟化 StackPanel 作为 ItemsControl/ListBox 中的 ItemPanel。它可以大大减少内存占用和单个时间点绘制的项目数量。这不一定有助于增加引发的事件的数量或事件,但当您有复杂的项目模板时,它可能会有很大帮助!

编辑:您正在使用 ObservableCollection,所以我假设 WPF/Silverlight..如果这不正确,请更新问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不锁定 GUI 的情况下将数千个项目添加到绑定集合中 的相关文章

随机推荐

  • 如何在 R markdown 中注释掉 R 代码块?

    我正在编辑一个 R markdown 文件 Rmd 该文件包含大量 R 代码块 可将这些代码块组移动到 子 文档中 以简化重新排列部分 如果没有其他情况 当我将节转换为子文档时 我想测试新的子文档而不运行其余的块和其他子文档 但是 当我用来
  • Python 3.3 中的哈希函数在会话之间返回不同的结果

    我在 python 3 3 中实现了 BloomFilter 并且每次会话都得到不同的结果 深入研究这种奇怪的行为让我了解了内部 hash 函数 它为每个会话的同一字符串返回不同的哈希值 Example gt gt gt hash 235
  • 如何将ResponseEntity写入HttpServletResponse?

    如何将 ResponseEntity 写入 HttpServletResponse 因为它使 ResponseBody 例如我有身份验证成功处理程序 Override public void onAuthenticationSuccess
  • lucene 字段的 store 属性

    lucene Field有一个构造函数 Field String name String value Store store Index index 例如 我可以通过以下方式创建一个新字段 Field f1 new Field text T
  • 在android中创建自定义警报框

    我知道这个问题已经被回答过很多次了 但我找不到任何好的资源 任何人都可以告诉如何创建自定义警报框对于安卓 我想要的是一个漂亮的警报框 其中有一些图像文本等 基本上是 mu 应用程序信息 我知道如何创建简单的警报框 如果可能 请指出任何示例代
  • 有没有办法从意外的“svn revert”中恢复?

    今天早上 我做了以下事情 搬起石头砸了自己的脚 开始对我的项目进行更改 对一堆文件进行了大量编辑 意识到我的方法完全错误 我需要重新开始 cd 到我的项目的顶层并执行 svn recursive revert 将我的本地沙箱恢复到更改前的状
  • 无法使用 install_github() 安装 IRkernel:Git 未安装?

    我试图让 R 在我的 Windows 机器上使用 Jupyter Notebook 我跟着IR内核教程 https irkernel github io installation 但是 我无法安装 GitHub 存储库 总是出现错误 ins
  • 避免在 VBA 代码中的 mySQL 查询中使用换行符

    我有以下内容VBA从数据库中提取数据 Sub Get Data from DWH Dim conn As New ADODB Connection Dim rs As New ADODB Recordset Dim dateVar As D
  • Visual Studio 和 TFS,检测 Visual Studio 外部的更改[重复]

    这个问题在这里已经有答案了 我正在使用带有 ASP NET Web 应用程序的 Visual Studio 2015 并安装了 Umbraco 和 uSync uSync 和 Umbraco 是什么并不重要 但是当我启动项目并在 Umbra
  • Kerberos - SPN 和密钥表

    我有一个项目 其中嵌入了启用了 SPNEGO 的 jetty 我希望能够在本地运行该项目以用于开发目的 启用 SPNEGO 我的问题是 SPN 和 keytab 是否与特定服务器相关联 或者我可以在服务的多个实例上使用同一组吗 Kerber
  • IHTTPModule 在 ASP.NET 中在 HTTP 和 HTTPS 之间切换

    我正在开发一个网站 其中包含需要通过 SSL 保护的部分 我已配置网站 以便在始终处于 SSL 模式时运行正常 我在 IE7 IE8 FireFox Safari Chrome 中看到 SSL 挂锁 为了实现 SSL 切换 我创建了一个实现
  • facebook redirect_uri 设置为 ios URL 方案

    我开始研究如何以编程方式使用 Facebook 我已经在我的应用程序中设置了 URL 方案 以便我可以使用 myappopenup 从浏览器打开它 然后我在 Facebook 上创建了一个应用程序 复制一个 AppId 并尝试如下所示 le
  • SVG中foreignObject的特征检测

    我在 SVG 中使用foreignObject 元素 但是 IE9 不支持该元素 我正在寻找一种检测此功能的方法 Modernizr 没有检测到此功能 似乎我无法像使用矩形 createSVGRect 一样使用 createSVGForei
  • 如何从 Perl 程序打开 Excel(程序,而不是文件)?

    我目前在 Windows 中有一个 perl 程序 它通过 Spreadsheet WriteExcel 创建并填充一个 excel 文件 但我希望在程序关闭时打开该文件 我尝试用谷歌搜索信息 但我发现的只是如何在 perl 中打开和读取
  • mysql 复杂的sql

    我今天早些时候提出了一个问题 并得到了很好的答复 效果很好 这个问题的第二部分从未得到答复 所以我再试一次 SELECT q id q question a question id a answer a correct FROM SELEC
  • 将列从 VARCHAR(MAX) 更改为 VARBINARY(MAX)

    我有一张桌子 上面有一个VARCHAR MAX 列 我需要将其更改为VARBINARY MAX 我尝试使用命令 ALTER TABLE TableName ALTER COLUMN ColumnName VARBINARY MAX 但我得到
  • 具有语法着色功能的 HTML 编辑器 jQuery 插件

    我正在寻找一个 jQuery 插件 它将显示用于 HTML 创作和编辑的文本区域 我正在寻找的东西 必须支持编写 HTML 而不是所见即所得的表示形式 必须像任何富客户端 IDE 一样在您键入时为 HTML 着色 应该是 jQuery 但原
  • Git 格式补丁查看器?

    有人正在向我发送由 git format patch 生成的补丁 是否有一个 GUI 在 Linux 上 可以打开这些 patch 文件 我已经尝试了很多 diff gui 但它们所做的只是比较两个现有的文件 文件夹 没有人可以显示补丁 除
  • 在 Python 子进程中使用 Windows 路径(指向可执行文件)

    我开始在安装了 cygwin Python 2 7 的 Windows 7 x64 计算机上开发一个小型 pdf 到 jpg 脚本 以下效果完美 import subprocess filename test subprocess chec
  • 如何在不锁定 GUI 的情况下将数千个项目添加到绑定集合中

    我有一个设置 其中可能有数千个项目 认为 3000 5000 个 将添加到ObservableCollection绑定到一些可视化界面 目前 添加它们的过程非常慢 大约 4 秒 1000 个项目 当然 GUI 在此期间没有响应 有什么好方法