如何修复{无法评估表达式,因为本机框架位于调用堆栈的顶部。}在Richtextbox中

时间:2019-01-28 12:36:16

标签: c#

我试图在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";
    }
}

2 个答案:

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

    }