如何在不锁定 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 的情况下将数千个项目添加到绑定集合中 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 如何在 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 在此期间没有响应 有什么好方法