zoukankan      html  css  js  c++  java
  • 线程访问ui,使用委托方式

    转:https://www.cnblogs.com/muyoucai/p/6257213.html

    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(); //执行线程
            }
        }
    }
  • 相关阅读:
    mysql -- 备忘
    Linux基础命令---压缩与打包
    nginx rewrite
    重启php-fpm
    Mysql:输出到文件
    IOS 自定义Layer(图层)
    IOS CALayer基本使用 (图层)
    IOS 拖拽事件(手势识别)
    IOS 旋转+缩放(手势识别)
    IOS 长按+轻扫(手势识别)
  • 原文地址:https://www.cnblogs.com/judes/p/9067033.html
Copyright © 2011-2022 走看看