赢表格标签更新超级慢

时间:2018-10-09 21:54:40

标签: c# winforms threadpool

我有一个用C#编写的Windows Forms应用程序,它可以进行一些自动化测试。我的测试在线程池上运行。 UI具有一堆标签,用于显示从外部设备读取的数据。在测试过程中,方法将新值写入单例类。单例类广播值更改,并且在UI线程上调用后,表单代码中的事件处理程序进行更新。我的问题是仅更新UI(72个标签)大约需要1.5秒。为什么要花这么长时间?仅供参考,对于所有72个值,只有一个事件广播,而对于这72个值中的每个值,都没有广播。

以下是代码(ProgramData.MaximumUnits = 18):

this.InvokeIfRequired(() =>
{
    var stopwatch = new Stopwatch();
    var rawData = TestData.Instance.RawDataDisplay;
    stopwatch.Start();
    for (int i = 0; i < ProgramData.MaximumUnits; i++)
    {
        Frequency1Label[i].Text = rawData[i].F1;
        Frequency2Label[i].Text = rawData[i].F2;
        TempSensorLabel[i].Text = rawData[i].T1;
        UnitInfoLabel[i].Text = rawData[i].ErrorCode;
    }
    stopwatch.Stop();
    MessageBox.Show(stopwatch.ElapsedMilliseconds.ToString());
});

经过时间通常约为1500ms。我觉得此操作应在不到100ms的时间内完成。

为什么会出现问题:我正在显示每1秒出现的外部获取的数据。由于更新UI需要1.5秒,因此我处于严重的束缚中,尤其是当数据可以以每半秒的速度进入时。

2 个答案:

答案 0 :(得分:0)

更改每个标签的文本时,您有可能要支付重绘表格的费用。您可以尝试先冻结表单,方法是调用SuspendLayout,对不同的控件进行所有更改,并在完成后调用ResumeLayout以立即重绘整个屏幕。

例如

SuspendLayout();

try
{
    // Update the labels
}
finally
{
    ResumeLayout(performLayout: true);
}

还请检查是否有任何标签具有TextChanged事件的事件处理程序,因为更改标签的文本将触发此事件(并且可能会使您的速度减慢)

答案 1 :(得分:-1)

将代码放入Form_load

try

{

ResumeLayout(performLayout: true);

}

finally

{

}

This.Refresh();

您必须在调用ResumeLayout方法之后使用This.Refresh()