我从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();
但它仍然锁定。最好的方法是什么? 提前谢谢。
答案 0 :(得分:1)
答案 1 :(得分:0)
我很遗憾地说,但最好的办法是不要使用文本框,而是获取一个编辑器组件(例如SyntaxEdit),该组件专为部分更新和处理大量文本而设计。由于您的处理,UI不会锁定,但因为文本框对于大文本而言效率不高,文本框在更新时会阻止UI线程。没有重写就行不通。你要比它的规格大14.900行。每次更新框中的文本时,它都会启动一个非常慢的重绘循环。一个你不能打断的,所以所有的线程都没有帮助 - 因为在这个更新周期结束之前,UI是无响应的。
还有其他组件用于&#34;真正的文本编辑器&#34;它也准备处理更大的文本。
答案 2 :(得分:-1)
在BackgroundWorker
中运行并显示某些进度可能是您最好的选择(如果您必须使用RichTextBox)。即便是其中一个旋转的AJAX图像也足够了。