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. hdu3294 girl‘s research

    题目大意:有多组数据,每组数据给出一个字符和一个字符串.该字符将变成’a‘,表示字符串中的所有该字符将变成’a‘,同时其他字符也将做相同的偏移.具体来说,如果该字符为’b‘,表示字符串中的’b‘都将变 ...

  2. 四则运算GUI设计2.0

    使用QT设计的界面如下: 程序流程是点击开始出题,会在题目后面的框中显示所出的题目,在输入答案以后点击提交答案会判断输入的答案是否正确. 输入后的界面: 部分代码如下: qtyunsuan.h文件: ...

  3. html基础 链接

    使用图像来作链接: (链接标签中嵌套图片标签) <html> <body> <p> 您也可以使用图像来作链接: <a href="/example/ ...

  4. 尚学堂Spring视频教程(三):Spring Core中的其他特性

    集合装配   如果bean中有一些集合属性,配置文件的配置如下 package com.bjsxt.dao.impl; import java.util.List; import java.util. ...

  5. web 音频文件自动播放(兼容所有浏览器)

    function AudioPerform() { var ua = navigator.userAgent.toLowerCase(); var audiopath = "$!{Templ ...

  6. python 2day

    一 优化 username='alex' password=‘alex123’ 可以写成 username,password =‘alex’,'alex123' 二.再次优化 for i in ran ...

  7. iOS-多线程 ,整理集锦,多种线程的创建

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  8. iOS 为iPhone和iPad创建不同的storyboard

    复制Main.storyboard,重命名为Main_iPad.storyboard 在info.plist文件中添加 Main storyboard file base name (iPad) -- ...

  9. linux中的进程和线程

    应用程序:可以被操作系统执行的一组指令和参数的集合,是静态的,并存储在磁盘空间中: 进程:在操作系统中在运行程序后,处于运行状态的程序,是应用程序的一个执行过程,同时也是操作系统分配内存,cpu等系统 ...

  10. 关于JavaScript lastIndexOf() 方法 w3school.com.cn写的不一定全对

    关于JavaScript lastIndexOf() 方法 w3school.com.cn的表述是 定义和用法 lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的 ...