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(); //執行線程 } } }
