高频刷新telerik radgridview

时间:2014-12-27 17:43:15

标签: c# winforms gridview telerik

在winform应用程序中,我遇到以下情况:

  1. 套接字接收高频数据(150-200包x秒)
  2. 我已经收到已解码数据包的网格视图
  3. 收到的商品可以是新商品,也可以是之前商品的更新商品。可以更新的商品价值
  4. gridview处于虚拟化模式:on
  5. 由于我无法绑定到BindingList(它会冻结Ui线程),我决定使用Queue并根据Timer更新网格视图。当处理计时器的已用事件时,我更新了调用的计时器      gridview.TemplateMaster.Refresh()导致调用cellValueNeeded

    这是我发现的最快的解决方案,但我遇到了一些问题:

    1. 我无法知道哪个列已更新
    2. 使用虚拟化导致我每次调用cellValueNeeded而我的List几乎无用,我可以将它用作二维数组
    3. 我自定义实现排序/过滤/列重新排序
    4. 你们中的任何人都有更好的方法吗? 感谢

2 个答案:

答案 0 :(得分:0)

给出以下附加信息:

  

我有8列......行号取决于拖动的项目   从树视图...在这个测试用例中,我有256行,但可以更多   ...对于第二点如果我重新引导整个项目源我放松了什么   已更新

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

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

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

后人的原始答案:

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

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

答案 1 :(得分:0)