在c#中处理大文本

本文关键字:文本 处理 | 更新日期: 2023-09-27 18:14:03

我从RichTextBox收到15.000(可以更多)行,我需要为每行添加一些值。最好的方法是什么,使程序不会锁定?

当前,我正在处理作为线程运行的循环中的行:

 public void Process()
        {
               string[] lines;
                string line;
                string foo = " baa";
                if (richTextBox1.InvokeRequired)
                {
                    lines = (string[])Invoke((ReadLines)delegate
                    {
                        return /* read .Lines[] from richTextBox1 */
                    });
                    int max = lines.Length;
                    for (int i = 0; i < max; i++)
                    {
                        line = lines[i];
                        if (..)
                        {
                            lines[i] += "foo";
                        }
                    }
                    Invoke((Update)delegate
                    {
                        /* set new lines to RichTextBox1 */ 
                    });
              } 
       }

然后:

Thread th1 = new Thread(Process);
 th1.Start();

但它仍然锁定。最好的方法是什么?

在c#中处理大文本

试试BackgroundWorker控件

我很抱歉地说,但你最好的选择是不使用文本框,而是获得一个编辑器组件(例如SyntaxEdit),它是为部分更新和处理大量文本而设计的。UI不会因为你的处理而锁定,而是因为文本框对于大文本是不可避免的,并且文本框在更新时阻塞了UI线程。不重写它是行不通的。可以说,您比规格多出了14900行。每次您更新框中的文本时,它都会启动一个非常缓慢的重绘循环。一个你不能中断的线程,所以所有的线程都不会有帮助——因为UI是不负责任的,直到这个更新周期结束。

还有其他组件用于"真正的文本编辑器",它们也准备处理更大的文本。

运行在一个BackgroundWorker与一些进展的指示可能是你最好的选择(如果你必须使用RichTextBox)。甚至其中一个旋转的AJAX图像就足够了。