交叉线程操作错误

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

这是c#中的代码,执行时会为listBox1生成无效的交叉线程操作错误,listBox1是我表单中的列表框。 请你们告诉我为什么? 我也使用invokeRequired方法,也没有更改列表框的内容。

InvokeRequired仅告诉您需要Invoke才能有效地访问该元素。 它不会使访问合法。 您必须使用invoke方法将更新推送到适当的线程

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

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

当InvokeRequired为false时,您的代码应该运行

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

编辑:签出使Windows窗体线程安全