首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Win Forms标签更新超级慢

问Win Forms标签更新超级慢
EN

Stack Overflow用户
提问于 2018-10-10 05:54:40
回答 1查看 854关注 0票数 -1

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

代码如下(ProgramData.MaximumUnits = 18):

代码语言:javascript
复制
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());
});

经过的时间通常在1500毫秒左右。我觉得这个操作应该在100ms内完成。

为什么这是一个问题:我显示的是从外部获取的数据,每隔1秒就会出现一次。由于更新UI需要1.5秒,因此我陷入了严重的困境,特别是当数据可以以每半秒的速度进入时。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-10 06:17:04

当您更改每个标签的文本时,您可能正在支付重新绘制表单的成本。您可以首先尝试冻结表单,方法是调用SuspendLayout,对不同的控件进行所有更改,然后在完成后调用ResumeLayout一次性重新绘制整个屏幕。

例如:

代码语言:javascript
复制
SuspendLayout();

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

此外,检查是否有任何标签具有用于TextChanged事件的事件处理程序,因为更改标签的文本将触发此事件(并且它可能正在做一些减慢您速度的事情)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52729883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档