在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();
但它仍然锁定。最好的方法是什么?
试试BackgroundWorker控件
我很抱歉地说,但你最好的选择是不使用文本框,而是获得一个编辑器组件(例如SyntaxEdit),它是为部分更新和处理大量文本而设计的。UI不会因为你的处理而锁定,而是因为文本框对于大文本是不可避免的,并且文本框在更新时阻塞了UI线程。不重写它是行不通的。可以说,您比规格多出了14900行。每次您更新框中的文本时,它都会启动一个非常缓慢的重绘循环。一个你不能中断的线程,所以所有的线程都不会有帮助——因为UI是不负责任的,直到这个更新周期结束。
还有其他组件用于"真正的文本编辑器",它们也准备处理更大的文本。
运行在一个BackgroundWorker
与一些进展的指示可能是你最好的选择(如果你必须使用RichTextBox)。甚至其中一个旋转的AJAX图像就足够了。