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

本文关键字:更新 实现 windows 窗体 | 更新日期: 2023-09-27 18:24:40

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

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

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

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

除了非常快的DataGridView,我还有其他控件可以使用吗?

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

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

您的限制因素可能是更新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,而不会受到用户的任何抵制。