【问题标题】:High frequency refresh telerik radgridview高频刷新telerik radgridview
【发布时间】:2014-12-27 17:43:15
【问题描述】:

在一个 winform 应用程序中,我有以下场景:

  1. socket 接收数据的频率很高(150-200packets x 秒)
  2. 我在收到的解码数据包上填充了一个网格视图
  3. 收到的商品可以是新商品,也可以是之前商品的更新。有 5 个可能的值可以更新
  4. gridview 处于虚拟化模式:开启

由于我无法绑定到 BindingList(它会冻结 Ui 线程),我决定使用队列并基于计时器更新网格视图。当处理计时器的经过事件时,我更新调用 gridview.TemplateMaster.Refresh() 导致 cellValueNeeded 被调用

这是我找到的最快的解决方案,但我有一些问题:

  1. 不知道哪一栏更新了
  2. 使用虚拟化导致我每次都调用 cellValueNeeded 而我的 List 几乎没用,我可以将它用作二维数组
  3. 我必须自定义实现排序/过滤/列重新排序

你们中有人有更好的方法吗? 谢谢

【问题讨论】:

  • 你真的尝试过使用BindingList吗?控件的ListChanged 事件对单个单元格值的更改作出反应,不应重新绑定整个列表。我希望它能够针对您的情况进行优化,因此速度非常快。快速浏览这里:telerik.com/help/winforms/… 我的意思是,这就是我们为这样的高级控件付费的原因……如果 Telerik 的网格在这种级别的数据上阻塞,我建议四处寻找不同的网格控件。
  • 是的,使用绑定列表很痛苦... UI 线程卡住了。 ..
  • 您能在哪里分享您的代码的某些部分吗?我怀疑您可能使网格控制工作比它必须的更难。

标签: c# winforms gridview telerik


【解决方案1】:

【讨论】:

  • 您好,我已经尝试过了,但它希望在之前填充数据源......如果我在 BindingList 中添加一个元素之后它不会更新 GridView
【解决方案2】:

鉴于以下附加信息:

我有 8 列...行号取决于拖动的项目 从树视图...在这个测试用例中,我有 256 行但可以更多 ...对于第二点,如果我重新定义整个 itemsource,我会失去什么 已更新

您的问题比您的 OP 建议的要复杂得多。您实际上有两个修改网格和基础数据的更改源。一个来自您传入的数据包,另一个来自用户。您还有 8*256=2048 个项目向用户展示。那是很多。根据我对 OP 的理解,UI 每秒可能会更新多达 1,000 个新值。这不是一个有用的功能,因为没有人可以如此快速地处理信息。

因此,鉴于用户可以从树视图中任意将数据拉入网格,并且您的数据包接收器每秒可以添加或更新一千个网格数据单元,我建议采用一种非常不同的方法:

  • 保留保存传入数据的队列集合
  • 在网格上方添加三个新的 UI:
    • 一个只读控件(简单的标签控件就可以),显示队列中当前的更新计数
    • 上次从数据包队列更新网格的时间戳
    • 用户手动点击该按钮以提取排队数据。单击该按钮会将时间戳重置为当前时间,并将排队项目的计数重置为 0
  • 您还可以让计时器自动更新数据,但让它更智能:
    • 延长自动更新之间的时间间隔
    • 在用户与 UI 交互时重置计时器(这基本上会造成网格仅在用户“空闲”或不与 UI 交互时自动更新的情况)
  • 移动的列不是问题,因为您可以通过列名而不是索引来查找/引用列
  • 由于用户可以对网格进行任意排序,因此您需要使用查找功能来识别要更新的行。您应该有某种(主/唯一)键列,可见或隐藏,通过它来识别行和基础对象
  • 所有其他功能保持不变

后人的原始答案:

我建议创建一个新集合,作为 UI 和套接字线程之间的共享资源(假设您有一个用于套接字通信的线程)。您将更新此集合以及最新更改的标志时间戳。这个标志很重要,因为除非数据确实发生了变化,否则您不会更改它。您还可以有一个额外的字段来计算自最近一次更改以来的更新次数。 (我假设/希望传入的大部分数据实际上不会有所不同。)

所以现在你有一个可以由两个线程共享的内部缓存。您不必担心同步问题,因为一个线程只写,另一个只读。

【讨论】:

  • 我有 8 列...行号取决于从树视图中拖动的项目...在这个测试用例中我有 256 行但可以更多...对于第二点如果我重新修改整个 itemsource 我会丢失已更新的内容
  • @advapi:您的问题比您的 OP 建议的要复杂得多。您应该使用上面评论中的信息更新您的 OP。这是非常重要的。也就是说,您实际上有两个修改网格和基础数据的源。一个来自您的数据包,另一个来自用户。您还有 8*256=2048 个项目要显示给用户。那是很多。 (在我上面编辑的答案中继续)
  • 事实上并不是所有的单元格都同时更新...我称之为启动时的一些风暴...之后更新很少
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
相关资源
最近更新 更多