Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在windows窗体中实现表的快速更新?_C#_Multithreading_Winforms_Datagridview - Fatal编程技术网

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,但我需要做得更好。