突出显示richTextBox1中匹配的字符串时,应用程序没有响应;输入大的.txt文件

本文关键字:响应 输入 文件 txt 应用程序 richTextBox1 显示 字符串 | 更新日期: 2023-09-27 18:00:39

我正在创建一个简单的日志解析/读取应用程序,当试图突出显示匹配的字符串(用户定义的输入)时,该应用程序会变得无响应,并报告在richTextBox1中发现了大型文本文件(1.5Mb或更大)的日志文件行字符串。小型文本文件工作正常。匹配的线条似乎显示得很好。当试图突出显示匹配字符串时(当越来越多地找到匹配字符串时),就会出现问题。

//application has user select *.txt file and assign contents to string[] logContents, not streaming file.
//list of matched strings is made
//matched strings are displayed in richTextBox1
StringBuilder RTBtext = new StringBuilder(richTextBox1.Text);
if (displayMatched != null && displayMatched.Length > 0)
{
    //displays line of log file that matched the entered string
    for (int s = 0; s < displayMatched.Length; s++)
    {
        RTBtext.Append(displayMatched[s] + Environment.NewLine);
    }
}
richTextBox1.Text = RTBtext.ToString();
//newline 'n added between matched line to increase readability
//Performance debugging shows "hot lines" with large CPU usage start here:
while (index < richTextBox1.Text.ToUpper().LastIndexOf(this.userInput1))
{
    richTextBox1.Find(this.userInput1, index, richTextBox1.Text.Length,RichTextBoxFinds.None);
    richTextBox1.SelectionColor = Color.White;
    richTextBox1.SelectionBackColor = Color.Blue;
    index = richTextBox1.Text.ToUpper().IndexOf(this.userInput1, index) + 1;
}

程序另一部分中的类似样式循环执行时不会出现问题。我的索引有问题吗?是什么让中央处理器工作这么辛苦?性能调试状态System.Windows.Forms.RichTextBox.get_Text();是最大的瓶颈。

我尝试了richTextBox1.SuspendLayoutResumeLayout,但没有运气(还有RTB1.SuspendPainting/ResumePainting)。

是否可以一次只高亮显示大约200行匹配的字符串,然后继续使用richTextBox1.VScrollBar?如果是这样,实现这一目标的最佳方式是什么?

突出显示richTextBox1中匹配的字符串时,应用程序没有响应;输入大的.txt文件

根据我的经验,RichTextBox不能很好地同时加载大量(兆字节以上)的文本。

我的建议是在调用搜索操作时直接处理文本文件,并将所有匹配的字节偏移量和长度存储到一个单独的哈希集/字典中。

一旦有了行号和字节偏移量的集合,就可以根据滚动位置动态地将文本写入RichTextBox(也称为无限滚动)。每次将新文本附加到RTB时,都会检查上一步中创建的哈希集中的字节位置。如果你找到了一个匹配的字节偏移量,你就可以在这个时候标记你的文本。在添加RTB时,不要忘记删除RTB开头的文本。

我个人处理此应用程序的方式是,除了上述内容外,还有一个单独的摘要视图,其中包含匹配的行号及其内容。通过这种方式,我可以获得所有匹配的文档的类似grep的视图。当单击摘要视图匹配项时,它会将RTB主视图滚动到文档中的该点,这样我就可以检查关注项周围的条目。

我以前使用过类似的技术来处理千兆字节大小的日志文件。