我试图在richtextbox中显示一个大文本文件,并且在程序中使用backgroundworker来避免死锁。
当我运行此行的程序值时
this.txtText.Text += text + "\r\n";
是
{Text = Cannot evaluate expression because a native frame is on top of the call stack.}
我认为richtextbox无法加载我的文件。
我该怎么办?
private void bgworker_DoWork(object sender, DoWorkEventArgs e)
{
lines = File.ReadAllLines(txtPath.Text);
foreach (string line in lines)
{
this.SetText(line);
}
}
private void SetText(string text)
{
if (this.txtText.InvokeRequired)
{
txtText.Invoke((ThreadStart)(() => SetText(text)));
}
else
{
this.txtText.Text += text + "\r\n";
}
}
答案 0 :(得分:0)
BackgroundWorker
使用单独的线程进行处理;通常,您不会在DoWork
处理程序中更新ui。
您需要完成DoWork
函数中的所有后台处理,并等待调用RunWorkerCompleted
。
您需要使用RunWorkerCompleted
来更新ui。
private void bgworker_DoWork(object sender, DoWorkEventArgs e)
{
lines = File.ReadAllLines(@"txtPath.Text");
}
private void bgworker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
foreach (string line in lines)
{
this.txtText.Text += (line + "\r\n");
}
}
答案 1 :(得分:0)
我发现我的问题与Richtextbox无关。我更改了数据结构,并使用列表结构代替了数组和字符串生成器,因此所有问题都得到解决。
StringBuilder strb = new StringBuilder();
private void bgworker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
List<string> list = new List<string>();
for (int i = 0; i < lines.Length; i++)
{
string line=lines[i];
list.Add(line);
}
foreach (string s in list)
{
strb.Append(s);
}
txtText.Text = strb.ToString();
}