gpt4 book ai didi

c# - 防止文本框因快速更新而滞后

转载 作者:太空狗 更新时间:2023-10-29 20:05:42 24 4
gpt4 key购买 nike

给定以下示例代码:

new Thread(() =>{    for(int i = 0; i < 10000; i++)    {        Invoke((MethodInvoker)() =>         {            myTextBox.Text += DateTime.Now.ToString() + "\r\n";            myTextBox.SelectedIndex = myTextBox.Text.Length;            myTextBox.ScrollToCarat();        });    }}).Start();

当您运行此代码时,在循环和线程终止后,文本框仍在更新(可能是因为缓冲的调用)。我的应用程序使用类似的逻辑来填充文本框,但我遇到了同样的问题。

我的问题是:我怎样才能尽快填充这个文本框,每次仍然滚动到底部,同时减少/消除这种延迟?

最佳答案

您可以在此处选择几个选项。首先,您可以在窗体上设置双缓冲,这将最终在底层位图上绘制所有更新,然后显示新绘制的图像(而不是在图形对象上单独绘制控件)。我看到这种方法的速度提高了大约 50%。将其放入构造函数中:

this.SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer,true);

要记住的另一件事是,对于大量数据,字符串连接速度很慢。您最好使用 StringBuilder 构建数据,然后使用 StringBuilder.ToString 显示它(尽管最好错开更新,也许每 100 次迭代一次)。在我的机器上,只需将其更改为附加到 StringBuilder,运行 10k 次迭代所需的时间从 2.5 分钟减少到大约 1.5 分钟。更好,但仍然很慢。

new System.Threading.Thread(() =>
{
for(int i = 0; i < 10000; i++)
{
sb.AppendLine(DateTime.Now.ToString());
Invoke((Action)(() =>
{
txtArea.Text = sb.ToString();
txtArea.SelectionStart = txtArea.Text.Length;
txtArea.ScrollToCaret();
}));
}
}).Start();

最后,刚刚测试了 staggering(在 Invoke 调用之前向上面的代码中添加了一个条件),并在 2 秒内完成。由于我们使用 StringBuilder 实际构建字符串,我们仍然保留所有数据,但现在我们只需要更新 100 次而不是 10k 次。

那么现在,您有哪些选择?鉴于这是一个 WinForm 应用程序,您可以利用许多 Timer 对象之一来实际执行该特定控件的 UI 更新,或者您可以只保留对底层数据的“读取”或“更新”次数的计数器(在您的情况下,流)并且仅在 X 次更改时更新 UI。同时使用 StringBuilder 选项和交错更新可能是可行的方法。

关于c# - 防止文本框因快速更新而滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com