Подсчет строк в richtextbox подсчитывается асинхронно - PullRequest
1 голос
/ 21 октября 2019

Я пишу код, который подсчитывает количество строк и длину текста из содержимого richtextbox. С небольшими кусками текста это работает отлично. Но когда появляются большие куски текста (более 100 КБ), когда я нажимаю «Enter» или «Backspace» в richtextbox, время отклика становится очень медленным. Например: 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;
}

1 Ответ

0 голосов
/ 22 октября 2019

Я скачал ваш код, и я не могу понять, почему вы создаете новый RichTextBox каждый раз, когда вы вызываете метод StatusPanelTextInfo:

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

Это причина, по которой у вас такая задержка в вашей программе. Каждый раз, когда вы изменяете / выбираете текст, вы создаете новый объект RichTextBox и копируете большой объем текста в его свойство Text. Вы должны удалить этот код, и тогда он будет работать достаточно быстро. Просто замените rtb в вашем расчете currentLine на richTextBox1.

В следующий раз, пожалуйста, укажите свой код в своем вопросе, вместо того, чтобы заставлять людей загружать его по внешней ссылке. Вся ваша форма класса была около 60 строк. При правильном выборе вы могли бы дать нам всю необходимую нам информацию, используя 20 строк.

...