我试图解决这个问题中的问题,但我最终遇到了另一个问题
,简而言之,这个问题是询问如何将一个大文件逐块加载到 textBox 中,
所以在后台工作人员 Do_work 事件中我这样做了:
using (FileStream fs = new FileStream(@"myFilePath.txt", FileMode.Open, FileAccess.Read))
{
int bufferSize = 50;
byte[] c = null;
while (fs.Length - fs.Position > 0)
{
c = new byte[bufferSize];
fs.Read(c , 0,c.Length);
richTextBox1.AppendText(new string(UnicodeEncoding.ASCII.GetChars(c)));
}
}
这不起作用,因为 backgroundWorker 不能影响 UI 元素,我需要使用 BeginInvoke 来做到这一点。
所以我改变了代码:
delegate void AddTextInvoker();
public void AddText()
{
using (FileStream fs = new FileStream(@"myFilePath.txt", FileMode.Open, FileAccess.Read))
{
int bufferSize = 50;
byte[] c = null;
while (fs.Length - fs.Position > 0)
{
c = new byte[bufferSize];
fs.Read(c , 0,c.Length);
richTextBox1.AppendText(new string(UnicodeEncoding.ASCII.GetChars(c)));
}
}
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
this.BeginInvoke(new AddTextInvoker(AddText));
}
这段代码有两个问题。
1-附加文本花费的时间越来越长(我认为由于字符串不变性,随着时间的推移替换文本将花费更长的时间)
2-在每次添加时,richTextBox 都会向下滚动到末尾,从而导致应用程序挂起。
问题是我该怎么做才能停止滚动和应用程序挂起?
在这里我能做些什么来增强字符串连接?
编辑:经过一些测试并使用马特的回答,我得到了这个:
public void AddText()
{
using (FileStream fs = new FileStream(@"myFilePath.txt", FileMode.Open, FileAccess.Read))
{
int bufferSize = 50;
byte[] c = null;
while (fs.Length - fs.Position > 0)
{
c = new byte[bufferSize];
fs.Read(c , 0,c.Length);
string newText = new string(UnicodeEncoding.ASCII.GetChars(c));
this.BeginInvoke((Action)(() => richTextBox1.AppendText(newText)));
Thread.Sleep(5000); // here
}
}
}
当加载暂停时,我可以毫无问题地读写或挂起,一旦文本超过richTextBox 大小,加载将向下滚动并阻止我继续。