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();//耗时操作 string content = "hi!";
label1.Invoke(new Action(() => { label2.Text = content; }));//控件回调,显示数据
}

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

      /*演示InvokeHelper(我们即将构造的帮助类)的使用方法*/

       //启动线程
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(GetValue);
t.IsBackground = true;
t.Start();
} //加载比较耗时的数据
void GetValue()
{
Thread.Sleep();
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这个方法的参数类型

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

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

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

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

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

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

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

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

使用方式: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@qq,欢迎大家一起交流学习

c#跨线程访问控件帮助类的更多相关文章

  1. C# WinFrom 跨线程访问控件

    1.跨线程访问控件委托和类的定义 using System; using System.Windows.Forms; namespace ahwildlife.Utils { /// <summ ...

  2. c#使用MethodInvoker解决跨线程访问控件

      功能函数测试集锦(77)  C#专区(114)  版权声明:本文为博主原创文章,未经博主允许不得转载. .net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线 ...

  3. winform跨线程访问控件

    首先说下,.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性.所以除了控件所在的线程外的线程调用会抛异常 (Cross-thread operation not va ...

  4. C# 关于跨线程访问控件问题

    跨线程访问控件问题的原因是:控件都是在主线程中创建的,而系统默认控件的修改权归其创建线程所有.在子线程中如果需要直接修改控件的内容,需要使用委托机制将控件的修改操作交给主线程处理.因此,当没有使用委托 ...

  5. C# 跨线程访问控件(MethodInvoker)

    参考:https://www.cnblogs.com/lvdongjie/p/5428815.html .Net 通常禁止跨线程访问控件,设置Control.CheckForIllegalCrossT ...

  6. c# winform InvokeRequired 解决跨线程访问控件

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它. Windows 窗体中 ...

  7. Winform之跨线程访问控件(在进度条上显示字体)

    此文章对于遇到必须使用线程但是没有办法在线程内操作控件的问题的处理  有很好的解决方案(个人认为的.有更好的方案欢迎交流.) 在做跨线程访问之前我们先了解下我们所做的需要达到的效果: 这个是批量的将x ...

  8. C# WinForm 跨线程访问控件

    问题出现: 在WinForm 处理多线程访问主线程的控件时候,就会出现如图所示的错误对话框:    解决方案:  方案一:去掉线程访问主线程UI控件的安全检查,使用: Control.CheckFor ...

  9. C#之Winform跨线程访问控件

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用ne ...

随机推荐

  1. Windows下修改Oracle监听端口

    先放开防火墙的端口,再来改监听端口. 只有一个实例: net stop OracleOraDb11g_home1TNSListener 再运行 NET Manager 修改实例名与Listener的端 ...

  2. EL总结

    El: 1.el表达式语言(是什么) 2.el是书写到jsp页面 3.el语法格式${ } 4.el算数运算(+,-,*,/,%), 逻辑运算(&&,||,!), 关系运算(>, ...

  3. storm基础系列之一----storm并发度概念剖析

    前言: 学了几天storm的基础,发现如果有hadoop基础,再理解起概念来,容易的多.不过,涉及到一些独有的东西,如调度,如并发度,还是很麻烦.那么,从这一篇开始,力争清晰的梳理这些知识. 在正式学 ...

  4. Oracle数据库自动增长列的实现过程

    1.创建序列 -- Create sequence create sequence INNERID minvalue 1 maxvalue 99999999999999 start with 1 in ...

  5. R安装包

    提取安装的报的版本号 installed.packages()[,c("Package","Version")] 查询按住哪个报的描述 library()

  6. CentOS 下 sftp 有人能连有人不能连 程序设定了禁用IP

    问题现象: 局域网的一台Linux上运行有sftp Server. 大家用FileZilia 连接,有两个人能够连接,有两个人不能连接. 解决问题: 1.先查看服务器上的sftp server是哪一个 ...

  7. Dimmer: 通过移动鼠标来改变 LED 的亮度

    原文地址 - https://www.arduino.cc/en/Tutorial/Dimmer 调光器 本例展示了如何通过个人电脑发送数据到 Arduino / Genuino 开发板来控制一个LE ...

  8. oracle rac自动生成awr

    cat awr.sql ######EXEC P_AWR_REPORT('201604251000', '201604251100', 'D_OUTPUT', '', FALSE); FALSE为ra ...

  9. JavaScript的学习3

    一.数组 1.定义数组格式:var 变量名 = [数组元素1,数组元素2] 2.遍历数组元素: 格式: var arr = []; for(var i=0;i<数组长度;i++){ arr[i] ...

  10. background-position值为像素时的使用方法

    以前一直都知道这个属性,但是每次使用的时候都是试来试去,感觉很麻烦,所以花了一点小时间研究了一下,很简单,跟大家分享一下. 此属性需要在background属性中使用,有关background属性的值 ...