C# 交叉线程操作错误

C# 交叉线程操作错误,c#,multithreading,C#,Multithreading,这是c#中的代码,执行该代码时,listBox1(我的表单中的listbox)会产生无效的跨线程操作错误。 你们能告诉我为什么吗?? 我也在使用invokeRequired方法,也没有更改列表框的内容。invokeRequired只是检查是否需要Invoke。您发现它是必需的,但没有调用调用 InvokeRequired只告诉您需要调用才能有效地访问元素。这并不意味着访问是合法的。必须使用invoke方法将更新推送到相应的线程 if (listBox1.InvokeRequired)

这是c#中的代码,执行该代码时,listBox1(我的表单中的listbox)会产生无效的跨线程操作错误。 你们能告诉我为什么吗??
我也在使用invokeRequired方法,也没有更改列表框的内容。

invokeRequired只是检查是否需要Invoke。您发现它是必需的,但没有调用调用

InvokeRequired只告诉您需要调用才能有效地访问元素。这并不意味着访问是合法的。必须使用invoke方法将更新推送到相应的线程

      if (listBox1.InvokeRequired)
       {
           listBox = new StringBuilder(this.listBox1.Text);
       }

当invokererequired为false时,应该运行代码

Action update = () => listbox = new StringBuilder(this.listBox1.Text);
if (listBox1.InvokeRequired) {
  listBox1.Invoke(update);
} else {
  update();
}
编辑:
查看

我以为微软的支架风格是在分离线上打开支架?!?;)@Mitch,MS没有正式的风格,但很多团体都使用换行符规则。这也是我对C风格语言的偏好。但是,当我将代码发布到web上时,我使用相同的行样式使示例更加简洁:)Mono项目实际上为其所有源代码指定了相同的行实践,这完全违反了Microsoft/StyleCop的指导原则——而且这并不是他们所做的唯一相反的事情。再说一遍,他们为什么要效仿微软?然而,这让我怀疑他们是否只是想激怒微软的开发者同样的线条风格对我个人来说似乎有点难看,尽管这可能只是习惯。不管怎样,这都是可以接受的。
delegate void SetListBoxDelegate(); 

void SetListBox()
{
    if(!InvokeRequired)
    {
        listBox = new StringBuilder(this.listBox1.Text);
    } 
    else 
        Invoke(new SetListBoxDelegate(SetListBox)); 
}