• 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(); //执行线程
            }
        }
    }
  • 相关阅读:
    ZOJ 1001 A + B Problem
    献给那些心软的人!!
    将表格的数据插入另一个表格
    把链接 显示为方框
    【ibus】设置ibus输入法(pinyin & sunpinyin)
    [Mongo] How to Install Mongo on Debian(不要安装)
    [Sinatra、Mongo] Mongo
    Sinatra+SQLite3+DataMapper
    [sinatra] Sinatra再入门
    [slim] Slim
  • 原文地址:https://www.cnblogs.com/muyoucai/p/6257213.html
Copyright © 2020-2023  润新知