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 ...
随机推荐
- a new blog from MarsEdit
终于在网上找到了一款mac 下的blog写作和发布工具了. 先测试一下.
- 在线开发工具helper
发现一个很有用的在线工具大全:http://tool.lu/ 同时,欢迎查看新开i云轩工作室: logo在线制作:http://www.uugai.com/
- Drools mvel方言drl断点调试方法
开发环境:myeclipse2014, jdk1.8.0.91,drools6.4.0.Final, drools-eclipse-plugin,mvel2-2.2.6.Final问题描述:drl使 ...
- HTML5服务器推送消息的各种解决办法
摘要 在各种BS架构的应用程序中,往往都希望服务端能够主动地向客户端推送各种消息,以达到类似于邮件.消息.待办事项等通知. 往BS架构本身存在的问题就是,服务器一直采用的是一问一答的机制.这就意味着如 ...
- 几大最短路径算法比较(Floyd & Dijkstra & Bellman-Ford & SPFA)
几个最短路径算法的比较:Floyd 求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3). Floyd-Warshall算法(Floyd ...
- arc下dealloc得处理
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- 在vs2012中使用TeeChart空间
今天下了TeeChart 安装中发现没有VS2012选项 在看了官网回答后 可以 如下解决 1.- Install last maintenance release of 28 Septemb ...
- Flasky学习笔记(一)
1. app.run(debug=True,host='10.0.2.15',port=8000)自定义host及port;
- .this语句指的是什么
This通常指的是当前对象的引用
- ldap实现用户认证
LDAP的用户认证类. public class LDAPHelper { private DirectoryEntry _objDirectoryEntry; /// <summary> ...