如何在Windows窗体中实现快速更新表?

时间:2014-09-25 10:47:05

标签: c# multithreading winforms datagridview

我目前正在使用DataGridView以表格格式显示我的数据。它有5列。

Problem:我收到的数据速度非常快,比如5毫秒。我使用BlockingCollection从一个线程中存储数据,并通过从另一个线程中获取数据来更新表。由于数据进入速度非常快,队列的大小会不断增加。

当我停止发送数据时,DataGridView继续添加行,理想情况下应该在我停止发送数据时立即停止。

我试图实现一个线程安全的循环队列但是没有用,我错过了很多消息。

我是否可以使用其他控制而不是DataGridView这是非常快的?

或者,如果有人能告诉我如何更好地实施它?

1 个答案:

答案 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而不会有用户的任何后退。