用线程操作控件时常会遇到的问题是"从不是创建'LISTBOX1'的线程访问它".其实,LISTBOX1是随着程序的启动创建的,启动时的线程是主线程,而试图用新建的线程去操作它,就会出错.如果要从其他线程中访问主线程中的元素时,可以用Invoke()方法,它具有两种重载形式,它的参数含有委托形式,所以对线程要调用的方法必须先定制一个委托.
private delegate void SetTextCallback();// 定义委托
private void send()
{
listBox1.Items.Add("aaaa/n");
Thread.Sleep(5000);
}
private void test()
{
SetTextCallback stcb = new SetTextCallback(send);//实例化委托,参数是要调用的方法
Invoke(stcb);
}
private void button1_Click(object sender,EventArgs e)
{
//Thread th = new Thread( new ThreadStart(send) );//实例化线程
Thread th = new Thread( new ThreadStart(test) );//实例化线程
th.Start();//启动线程
}
注:黑色源码,红色是改正后正确的.