1

我编写了一个代码来计算来自richtextbox 内容的行数和文本长度。使用小块文本,它可以完美运行。但是当我在richtextbox中按“Enter”或“Backspace”时有大块文本(超过100k)时,响应时间变得非常慢。例如:https ://i.imgur.com/QO2UrAw.gifv

我的问题。有什么更好的异步运行代码的方法?

使用测试项目存档 https://gofile.io/?c=LpF409

private void StatusPanelTextInfo()
{
    int currentColumn = 0;
    int currentLine = 0;
    int linesCount = 0;
    if (statusStrip1.Visible)
    {
        currentColumn = 1 + richTextBox1.SelectionStart - richTextBox1.GetFirstCharIndexOfCurrentLine();
        RichTextBox rtb = new RichTextBox
        {
            WordWrap = false,
            Text = richTextBox1.Text
        };
        currentLine = 1 + rtb.GetLineFromCharIndex(richTextBox1.SelectionStart);
        linesCount = richTextBox1.Lines.Count();
        if (linesCount == 0)
        {
            linesCount = 1;
        }
    }
    toolStripStatusLabel1.Text = "Length: " + richTextBox1.TextLength;
    toolStripStatusLabel2.Text = "Lines: " + linesCount;
    toolStripStatusLabel3.Text = "Ln: " + currentLine;
    toolStripStatusLabel4.Text = "Col: " + currentColumn;
}
4

1 回答 1

0

我下载了您的代码,但我不明白为什么每次调用StatusPanelTextInfo方法时都要创建一个新的 RichTextBox:

RichTextBox rtb = new RichTextBox
{
    WordWrap = false,
    Text = richTextBox1.Text
};

这就是您的程序出现如此滞后的原因。每次更改/选择文本时,都会创建一个新的 RichTextBox 对象并将大量文本复制到其 Text 属性。您应该删除此代码,然后它会运行得足够快。只需rtb在计算中替换currentLinewith 即可richTextBox1

下次请在您的问题中提供您的代码,而不是让人们从外部链接下载它。你的整个表单类大约有 60 行。通过适当的选择,您可以使用 20 行为我们提供所需的所有信息。

于 2019-10-22T16:25:12.570 回答