C#中線程對控件的訪問


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM