Control类提供了一个Invoke方法来给子线程访问主线程的控件,它的原型是酱紫的:
object.Control.Invoke(Delegate method); object.Control.Invoke(Delegate method,params object[] args);
method是已创建的委托对象,如果该对象的关联方法有参数,那就放在数组args中,没有就不用传
Invoke食用方法如下(假设我访问控件的方法是getForms()):
public delegate void getFormsDelegate(getForms的参数声明);//声明一个与所调用的用来访问控件的方法匹配的委托类型,参数必须一致 public void myThread() { //线程通过getFormsDelegate()的委托,间接执行访问控件的方法getForms()
Invoke(new getFormsDelegate(getForms),new object[] {getForms的参数列表}); }
来一个完整的例子:
这是使线程将学生信息输出到ListBox控件的例子
namespace ThreadVisitingControl
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void showStuIfo(string no, string name, double score) //本例中的线程要通过这个方法来访问主线程中的控件
{
listBox1.Items.Add("学号:" + no);
listBox1.Items.Add("姓名:" + name);
listBox1.Items.Add("成绩:" + score.ToString());
}
public delegate void stuInfoDelegate(string no, string name, double score); //声明委托类型 private void stuThread() //线程方法
{
Invoke(new stuInfoDelegate(showStuIfo), new object[] { "", "张三", 95.5 }); //线程通过方法的委托执行showStuIfo(),实现对ListBox控件的访问 }
private void button1_Click(object sender, EventArgs e)
{
Thread stuth = new Thread(new ThreadStart(stuThread)); //创建线程
stuth.Start(); //执行线程
}
}
}