c#跨线程访问控件帮助类
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#跨线程访问控件帮助类的更多相关文章
- C# WinFrom 跨线程访问控件
1.跨线程访问控件委托和类的定义 using System; using System.Windows.Forms; namespace ahwildlife.Utils { /// <summ ...
- c#使用MethodInvoker解决跨线程访问控件
功能函数测试集锦(77) C#专区(114) 版权声明:本文为博主原创文章,未经博主允许不得转载. .net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线 ...
- winform跨线程访问控件
首先说下,.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性.所以除了控件所在的线程外的线程调用会抛异常 (Cross-thread operation not va ...
- C# 关于跨线程访问控件问题
跨线程访问控件问题的原因是:控件都是在主线程中创建的,而系统默认控件的修改权归其创建线程所有.在子线程中如果需要直接修改控件的内容,需要使用委托机制将控件的修改操作交给主线程处理.因此,当没有使用委托 ...
- C# 跨线程访问控件(MethodInvoker)
参考:https://www.cnblogs.com/lvdongjie/p/5428815.html .Net 通常禁止跨线程访问控件,设置Control.CheckForIllegalCrossT ...
- c# winform InvokeRequired 解决跨线程访问控件
C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它. Windows 窗体中 ...
- Winform之跨线程访问控件(在进度条上显示字体)
此文章对于遇到必须使用线程但是没有办法在线程内操作控件的问题的处理 有很好的解决方案(个人认为的.有更好的方案欢迎交流.) 在做跨线程访问之前我们先了解下我们所做的需要达到的效果: 这个是批量的将x ...
- C# WinForm 跨线程访问控件
问题出现: 在WinForm 处理多线程访问主线程的控件时候,就会出现如图所示的错误对话框: 解决方案: 方案一:去掉线程访问主线程UI控件的安全检查,使用: Control.CheckFor ...
- C#之Winform跨线程访问控件
C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用ne ...
随机推荐
- [LeetCode] 10. Regular Expression Matching
Implement regular expression matching with support for '.' and '*'. DP: public class Solution { publ ...
- Mysql5.5源码安装步骤笔记记录
1.cmake软件的安装wget https://cmake.org/files/v3.5/cmake-3.5.0-rc3.tar.gztar xf cmake-3.5.0.tar.gzcd cmak ...
- Spring MVC4 纯注解配置教程
阅读本文需要又一定的sping基础,最起码要成功的运行过一个SpringMvc项目. 在传统的Spring项目中,我们要写一堆的XML文件.而这些XML文件格式要求又很严格,很不便于开发.而网上所谓的 ...
- jquery “做页面滚动到某屏时改变状态标题” 所用知识点记录
浏览器滚动条滚动时触发事件 //浏览器滚动条滚动时触发事件 $(window).scroll(function(){}); 浏览器窗口大小改变时触发事件 //浏览器窗口大小改变时触发事件 $(wind ...
- centos 安装rmagick 2.13.4出错
因为安装redmine,缺少rmagick,使用bundle install安装依赖的gem,报错如下: 然后,网上查询一下,都是ubuntu系统下的解决方案. centos下正确的解决方法如下: y ...
- Spring配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...
- python 核心编程课后练习(chapter 2)
2-4 #2-4(a) print "enter a string" inputstring = raw_input() print"the string is: &qu ...
- Github上传自己的工程
1.注册并新建项目 2.配置github for windows 前题:安装相应的github for windows 2.1 获取密钥 可以用命令的模式(Git bash),参考资料中有相应的用法: ...
- 对OpenCV直方图的数据结构CvHistogram的理解
前几天被OpenCV的直方图的数据结构CvHistogram弄得很纠结.上网一搜,也没什么相关的资料.现在有点头绪了,就写点东西,让后面的人好走一些吧. 先来看看CvHistogram的定义: typ ...
- 官方提供的屏蔽百度转码Baidu Transcoder的方法no-transform
首先,百度在官方的声明中说:[喝小酒的网摘]http://blog.hehehehehe.cn/a/17112.htm百度仅作为中立的转码工具及相关技术的提供方.在转码过程中,百度对第三方网站内容不做 ...