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[] { "20101001", "张三", 95.5 }); //线程通过方法的委托执行showStuIfo(),实现对ListBox控件的访问 } private void button1_Click(object sender, EventArgs e) { Thread stuth = new Thread(new ThreadStart(stuThread)); //创建线程 stuth.Start(); //执行线程 } } }