我目前正在使用DataGridView
以表格格式显示我的数据。它有5列。
Problem:
我收到的数据速度非常快,比如5毫秒。我使用BlockingCollection
从一个线程中存储数据,并通过从另一个线程中获取数据来更新表。由于数据进入速度非常快,队列的大小会不断增加。
当我停止发送数据时,DataGridView
继续添加行,理想情况下应该在我停止发送数据时立即停止。
我试图实现一个线程安全的循环队列但是没有用,我错过了很多消息。
我是否可以使用其他控制而不是DataGridView
这是非常快的?
或者,如果有人能告诉我如何更好地实施它?
答案 0 :(得分:2)
您的限制因素可能是更新DataGridView
,而更快的队列对您无济于事。例如,您的描述表明您的更新循环如下所示:
while (queue not empty)
{
get queue item
update data grid
}
每次更新数据网格时,都会运行一些布局逻辑,很可能会尝试更新屏幕。这是一项非常昂贵的操作。几乎可以肯定的是,DataGridView
如果每次插入后都必须更新屏幕,则无法跟上每秒200条记录的插入速度。
我建议的第一件事是批量更新DataGridView
,在开始批处理前调用SuspendLayout,在批处理结束时调用ResumeLayout。所以你的循环就像这样:
int MaxItemsPerBatch = 10;
while (queue not empty)
{
grid.SuspendLayout();
int numItems = MaxItemsPerBatch;
while (numItems > 0 && queue not empty)
{
get item from queue
update data grid
numItems = numItems - 1
}
grid.ResumeLayout();
}
这里,布局逻辑每批只运行一次,所以你应该快10倍。这仍然为您提供每秒20次更新的屏幕更新速率,这将比您的用户看到的更快。您可以将批量大小增加到100而不会有用户的任何后退。