C# 如何在windows窗体中实现表的快速更新?
我目前正在使用C# 如何在windows窗体中实现表的快速更新?,c#,multithreading,winforms,datagridview,C#,Multithreading,Winforms,Datagridview,我目前正在使用DataGridView以表格格式显示数据。它有5列 问题:我接收到的数据速度非常快,比如说5毫秒。我正在使用BlockingCollection存储来自一个线程的数据,并通过从另一个线程获取数据来更新表。所发生的事情是,队列的大小不断增加,因为数据进入的速度非常快 当我停止发送数据时,DataGridView继续添加行,理想情况下,当我停止发送数据时,这些行应该立即停止 我试图实现一个线程安全的循环队列,但没有成功,我错过了它的许多消息 有没有其他控件可以代替非常快的DataGr
DataGridView
以表格格式显示数据。它有5列
问题:
我接收到的数据速度非常快,比如说5毫秒。我正在使用BlockingCollection
存储来自一个线程的数据,并通过从另一个线程获取数据来更新表。所发生的事情是,队列的大小不断增加,因为数据进入的速度非常快
当我停止发送数据时,DataGridView
继续添加行,理想情况下,当我停止发送数据时,这些行应该立即停止
我试图实现一个线程安全的循环队列,但没有成功,我错过了它的许多消息
有没有其他控件可以代替非常快的DataGridView
或者如果有人能告诉我如何更好地实现它?很可能您的限制因素是更新
DataGridView
,而使队列更快对您没有帮助。例如,您的描述表明您的更新循环如下所示:
while (queue not empty)
{
get queue item
update data grid
}
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();
}
每次更新数据网格时,都会运行一些布局逻辑,并且很可能会尝试更新屏幕。那是一个非常昂贵的手术。几乎可以肯定的是,DataGridView
无法跟上每秒200条记录的插入速率,如果它必须在每次插入后更新屏幕
我建议的第一件事是批量更新DataGridView
,在开始批处理之前和批处理结束时调用。所以你的循环变成这样:
while (queue not empty)
{
get queue item
update data grid
}
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,而无需用户的任何回退。在添加下一个块之前,您是在追加行还是清除整个网格?您是在逐个向datagridview添加新项?最好进行一些兑现,并将数据包(例如100行)添加到网格中……您提到您“通过获取数据更新表”,因此如果“数据进入的速度非常快”,请放慢获取数据的节奏。还可以对DataGridViewThank使用双缓冲。c语言中是否有内置的线程安全循环队列?就像线性线程安全数据结构中存在BlockingCollection一样?谢谢你的建议。它提高了表更新速度。尽管如此,我还是丢失了很多消息,我想这可能是因为我正在使用的循环队列实现。你能和我分享线程安全循环队列的最佳代码吗?@ankur:我的建议是使用
BlockingCollection
。我确信BlockingCollection
可以轻松处理每秒超过200条记录的排队和退队。这不是“最理想的”,但它速度很快,效果也很好。我怀疑您的限制因素仍然是DataGridView
UI更新。您是否尝试增加批处理大小?是的,您做得对,先生,我在DataGridView
方面遇到了问题。现在,我正在使用普通的队列并暂停布局,直到表中出现滚动事件。它稍微改进了UI,但我需要做得更好。