c#winform跨线程访问控件

1.背景

对于winform程序来讲,当咱们点击按钮,须要消耗必定时长才能拿到数据后才能显示在界面上某个控件上的状况,咱们一般会专门开一个线程去拿数据,这样不会形成界面处于假死状态异步

2.常规作法

//启动线程
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(GetValue);
            t.IsBackground = true;
            t.Start();
        }

        void GetValue() 
        {
            Thread.Sleep(2000);//耗时操做
          
            string content = "hi!";
            label1.Invoke(new Action(() => { label2.Text = content; }));//控件回调,显示数据
        }

3.封装异步加载数据,造成轮子,方便之后直接使用示例

//启动线程
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(GetValue);
            t.IsBackground = true;
            t.Start();
        }

    
        //加载比较耗时的数据
        void GetValue() 
        {
            Thread.Sleep(2000);
            string value = "hello,异步!";
            InvokeHelper.Invoke(this, "DoWork", value);//演示invoke方法
            InvokeHelper.Set(label1, "Text", "兔");//演示set方法
            object temp = InvokeHelper.Get(label1, "Tag"); //演示Get方法
            InvokeHelper.Set(label2, "Text", temp);
        }

        //控件赋值赋值
        public void DoWork(string value) 
        {
            richTextBox1.Text = value;
        }

4.该Rabbit.InvokeHelper.DLL使用说明手册

   方法简介:函数

 I.public static object Invoke(Control control, string methodName, params object[] args)  

    功能:主要用于其余线程作完耗时操做拿到数据后,给UI线程上的控件赋值学习

    参数:Contorl指代控件,methodName表示当天cs文件中一个方法的名字,用于在这个方法下进行控件的赋值操,args是这个methodName这个方法的参数类型this

    使用方式:见上面代码的调用过程.相信你能看懂,并不难。spa

II.  public static object Get(Control control, string propertyName)

    功能:从其余线程里跨线程拿取UI控件的值.net

    参数 :Control,将要访问的控件;propertyName,控件的属性值线程

    使用方式:见上面的使用案例code

III.  public static object Get(Control control, object noncontrol, string propertyName)

   功能:从其余线程里跨线程拿取UI控件的值orm

   参数:Control,将要访问的控件;noncontrol,一个扩展对象,若是不为null则该函数的功能时拿取该对象的属性值;propertyName,控件的属性值xml

   使用方式:object t=InvokeHelper.Get(label1,label1.TopLevelControl,"Text"); //这样拿到的将是lable控件顶层容器的Text属性值

IV.  public static void Set(Control control, string propertyName, object value)

   功能:从其余线程给UI线程控件设置一个值

   参数:Control,控件;propertyName,控件属性值;value,将要赋值给控件属性的数据

   使用方式:见上面的实例

V. public static void Set(Control control, object noncontrol, string propertyName, object value)

   功能:从其余线程给UI线程控件设置一个值

   参数:Control,控件;propertyName,控件属性值;noncontrol,一个扩展对象,若是不会null,则该函数的功能是设置该扩展对象的属性值;value,将要赋值给控件属性的数据

  使用方式: InvokeHelper.Set(label1, label1.TopLevelControl, "Text","Hello");将hello赋值给label1的父级控件的text属性

5.dll下载

xml注释下载  密码:hd0z        

dll下载      密码:9wve

6.关于

本人qq:739462304欢迎你们一块儿交流学习

相关文章
相关标签/搜索