看看运行结果:
在非UI线程中访问控件,自然要先去开一个线程,然后我们再在这个线程中访问控件。首先,我们新建一个winform程序,在窗体上放置一个button,其text为"异步改变文字",然后创建按钮点击事件:
private void button1_Click(object sender, EventArgs e)
{
hread thread = new Thread(new ThreadStart(ChangeText));
thread.Start();
}
public void ChangeText()
{
//使用Lamble表达式...
if (button1.InvokeRequired)
{
Action<string> Change = (str) => { button1.Text = str; };
this.button1.Invoke(Change, new object[] {"跨线程改变控件文字"});
}
}
当点击按钮时,我们就新开一个线程,并用ThreadStart委托绑定一个方法,当线程开始的时候,我们便用Lamble表达式来修改按钮上的文字,接着就是触发调用(Invoke)委托。Invoke函数的第一个参数是委托对象,第二个参数就是传给委托的实参str.对于Lamble表达式有不懂得,请看《由普通委托到匿名委托再到Lamble表达式的步步优化》