C#中线程对控件的访问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(); //执行线程
        }
    }
}

 

以上是关于C#中线程对控件的访问的主要内容,如果未能解决你的问题,请参考以下文章

C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它

C# 如何跨线程对Window窗体控件进行安全访问 (第二版)?

C# 跨线程对控件赋值

C#关于定时器和多线程中对控件的操作以及界面假死的现象。

c#如何跨线程调用窗体控件

c#中如何跨线程调用windows控件