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(); //执行线程
        }
    }
}
原文地址:https://www.cnblogs.com/muyoucai/p/6257213.html