if (listBox1.InvokeRequired)
{
listBox = new StringBuilder(this.listBox1.Text);
}
这是c#中的代码,执行时会为listBox1生成无效的交叉线程操作错误,listBox1是我表单中的列表框。 请你们告诉我为什么? 我也在使用invokeRequired方法,也没有改变列表框的内容。
答案 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));
}