2014-06-24 82 views
2

我使用DataGridView来监视IO事件。每次发生新的IO事件时,DataGridView都会填充一个包含其他数据中的时间戳的新项目。这些更新每10毫秒进行一次,我希望将新项目放在网格顶部。快速更新DataGridView

我只需要在网格中保留〜100行;应该丢弃旧的,以免消耗内存。我所有的尝试都被证明太慢,你有什么想法来解决这个问题?

回答

1

显示滴答数据是相当具有挑战性的任务。提高性能的最大步骤之一是将刷新率降低到人眼可识别的数字 - 每秒刷新20次,而不会对每个IO事件做出反应。

  1. 创建或使用环形缓冲区仅存储100条记录并减少GC /内存。
  2. 使用调度程序计时器并每隔50ms安排一次网格刷新。在计时器滴答声中,将缓冲区数据抓取到预分配的集合中,并完全刷新网格。

然后,您可以通过优化步骤2来进一步改进实施 - 例如减少单元格的度量。

+0

好吧,所以我创建了一个RingBuffer实现IList ,ICollection ,IEnumerable 和IEnumerable。但是,当我将它绑定到DataGridView(通过BindingSource)时,DataGridView将显示RingBuffer的属性而不是其项目。有任何想法吗? – Simon

+1

我只是将RingBuffer的状态复制到一个新的集合中。 “将缓冲区数据抓取到预分配的集合中,并完全刷新网格”。绑定到在后台不断更改的集合并不是一个好主意。 –