-1

我正在尝试编写一些可以检索和解析网站 HTML 的代码。我在这方面取得了成功,但是当我尝试使用后台工作人员将其放入富文本框中时,我得到了一个跨线程异常。

List<string> retuInfo = new List<string>();
foreach (var inf in info)
{
       retuInfo.Add(inf.InnerText);
       richTextBox1.Lines = retuInfo.ToArray();
}

我得到了例外richTextBox1.Lines = retuInfo.ToArray();

我已经看过一些关于“不安全线程和安全线程”的内容,但没有一个真正有帮助,因为线程是一个非常高级的主题,可能会给你带来一些棘手的错误。

有什么可能的帮助吗?

4

2 回答 2

1

在您的表单中定义一个方法,将行附加到控件:

public void SetRichTextBoxText(string[] lines)
{
    if(!richTextBox1.InvokeRequired)
    {
        richTextBox1.Lines = lines;
    }
    else
    {
        var callback = new Action<string[]>(SetRichTextBoxText);
        Invoke(callback, lines);
    }
}

在您的后台工作人员中调用如下方法:

form.SetRichTextBoxText(info.Select(inf => inf.InnerText).ToArray());
于 2013-05-02T08:29:02.993 回答
1

当您更新 UI 控件时,您应该从 UI 线程调用而不是从Backgroundworker线程更新。要调用 Ui 线程,您应该使用InvokeBeginInvoke调用 Richtextbox 控件上的线程 UI 更新。

你可以参考这里:

调用(委托)

或者

在 WinForms 上使用 TPL 进行并行编程

于 2013-05-02T07:57:44.037 回答