当前位置:C++技术网 > 资讯 > 教你如何在非UI线程中访问UI线程控件

教你如何在非UI线程中访问UI线程控件

更新时间:2016-08-11 20:22:20浏览次数:1+次

以前看书的时候,经常看到一些专业术语:控件与线程相关,控件绑定在了线程上,非控件线程(一般是UI线程)不能访问控件,不然编译器会报错。尽管经常看到,但是当时没注意,知道写代码的时候遇到,经过一番研究才跳出这个坑!在《线程间操作无效: 从不是创建控件"Form1"的线程访问它的三种解决方案 》中也说了,不过代码比较繁琐,我自己看着都累,因此,重新写了一个示例来描述这个“控件的线程相关性!”,用的方法也是Invoke().

看看运行结果:

在非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表达式的步步优化