2011-11-11 60 views
1

我从RichTextBox收到15.000(可能更多)行,我需要为每行添加一些值。 这样做的最好方法是什么,这样程序不会锁定?在C中处理大文本#

目前,我在处理时被作为线程运行在一个循环的线路:

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

,但它仍然锁定。什么是最好的方法来做到这一点? 在此先感谢。

+1

这是不幸的本质 - 丰富的文本框控件并不意味着持有这么多行,该任务将锁定用户界面。我会认为“重新设计”而不是“解决方法” – BrokenGlass

+0

是的。无论是在添加之前进行预先讨论,还是在最后 - 文本bos都不是为此而创建的,可以获得商业/专业编辑组件。 – TomTom

回答

0

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

“真正的文本编辑器”还有其他组件可以处理更大的文本。

+0

还有没有使用RichTextBox的另一个解决方案?这是因为我需要突出显示它的一些文本.. –

+0

检查SyntaxEdit - 商业,花钱,编程器组件(高亮等),并处理大文件。 – TomTom

1
+0

-1。考虑到更新已经发生在单独的线程中(可以在调用中看到),很可能无法处理该问题。后台工作人员不会处理文本框所需的极长时间更新。在此期间,用户界面仍会锁定。 – TomTom

-1

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

+0

-1。指示很好,但它不会处理海报明确要求的问题(UI锁定)。 – TomTom