线程间操作无效: 从不是创建控件“t1”的线程访问它


开发时 经常会遇到上面的问题,原因常常是在新Thread中给窗体中的控件赋值。

为了解决此问题,我们可以调用this.BeginInvoke(Delegate method);方法,this.表示窗体,当然可以用想要调用 的控件,比如Label,Button。

此方法的参数要求为委托参数,我们可以使用

this.BeginInvoke(MethodInvoker)delegate(){//方法体})

来简写,

private void button1_Click(object sender, EventArgs e)

{

Thread t = new Thread(new ParameterizedThreadStart(test1));

t.Start(t1);

}

void test1(object label)

{

this.BeginInvoke((MethodInvoker)delegate()

{

(label as Label).Text = Thread.CurrentThread.ManagedThreadId.ToString();

});

//直接给控件赋值会引发异常

// (label as Label).Text = Thread.CurrentThread.ManagedThreadId.ToString();

}

当然这里也可以调用Invoke方法,跟BeginInvoke的区别只是同步跟异步的区别而已。