在C#中处理大文本

时间:2011-11-11 04:16:22

标签: c# .net richtextbox text-processing

我从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();

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

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

我很遗憾地说,但最好的办法是不要使用文本框,而是获取一个编辑器组件(例如SyntaxEdit),该组件专为部分更新和处理大量文本而设计。由于您的处理,UI不会锁定,但因为文本框对于大文本而言效率不高,文本框在更新时会阻止UI线程。没有重写就行不通。你要比它的规格大14.900行。每次更新框中的文本时,它都会启动一个非常慢的重绘循环。一个你不能打断的,所以所有的线程都没有帮助 - 因为在这个更新周期结束之前,UI是无响应的。

还有其他组件用于&#34;真正的文本编辑器&#34;它也准备处理更大的文本。

答案 2 :(得分:-1)

BackgroundWorker中运行并显示某些进度可能是您最好的选择(如果您必须使用RichTextBox)。即便是其中一个旋转的AJAX图像也足够了。