交叉线程操作错误

时间:2009-05-16 16:52:58

标签: c# multithreading

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

delegate void SetListBoxDelegate(); 

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

编辑: 查看Making Windows Forms thread safe

相关问题