BackgroundWorker - 跨线程操作无效

Kri*_*s-I 16 c# winforms

我有一个winform应用程序(一个表单),在这个表单上有一个RichTextBox.在这个表单的构造函数中,我创建了一个类的实例MyClass.在"Form_Load"中,我InitialisationMyClass实例中调用该方法.

在表单构造函数中

myClass = new MyClass(RichTextBox richTextBox);
Run Code Online (Sandbox Code Playgroud)

在Form_Load中

myClass.Initialisation();
Run Code Online (Sandbox Code Playgroud)

Initialisation方法中,在循环中,我读了一些参数做其他的东西.为了不冻结应用程序(因为某些操作可能需要一段时间,几秒钟),我使用了BackgroundWorker.我这样使用它(见下面的代码).

当我执行时,我收到此错误:跨线程操作无效:控制'richTextBox'从其创建的线程以外的线程访问.

你能告诉我怎么解决这个问题吗?当我不访问时,工作完美richTextBox

public Class MyClass
{
    static BackgroundWorker _bw;
    public MyClass()
    {
        _bw = new BackgroundWorker
        {
            WorkerReportsProgress = true,
            WorkerSupportsCancellation = true
        };
        _bw.DoWork += bw_DoWork;
        _bw.ProgressChanged += bw_ProgressChanged;
        _bw.RunWorkerCompleted += bw_RunWorkerCompleted;
    }
    static void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        foreach (....)
        {
            if (....)
            {
                richtextBox.Text.AppendText("MyText");
            }
        }
        e.Result = true;
    }
    static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){}
    static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e){}
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 33

使用BackgroundWorker并不能免除正常的线程规则 - 例如只有 UI线程才能访问UI组件.

如果要从BackgroundWorker 使用进度/完成事件(在UI线程上引发)之外其他事件更新UI ,则需要使用Control.Invoke/ Control.BeginInvoke就像在其他情况下一样.例如:

if (....)
{
    Action action = () => richtextBox.Text.Add("MyText");
    richtextBox.Invoke(action); // Or use BeginInvoke
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*mal 12

试试这段代码,

BeginInvoke((MethodInvoker)delegate
{
    richtextBox.Text.Add("MyText");
});
Run Code Online (Sandbox Code Playgroud)