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 ...
随机推荐
- 说说Web.Config与App.Config
说到web.config和app.config大家都很熟悉,我们都叫他们配置文件,平时用的多,注意的少.两个有啥区别呢,很简单,一句话:如果是web程序,如webform项目类型和mvc项目类型就是w ...
- 开发安卓应用之中兴手机与macbook pro 连接设定
目标: 把中兴手机和macbook pro 连接在一起,实现真机调试安卓应用. 工具: 手机型号:zte v956 mac os: OS X 10 Eclipse: Android Developer ...
- linux mint 崩溃
换完linux mint 今天突然崩溃了.出现如下错误 因为是双屏.一个屏幕显示一般,这么不重要.搜了一下,找到解决方案 解决办法 ctrl+atl+f1 login sudo apt-get ins ...
- css3画三角形的原理
以前用过css3画过下拉菜单里文字后面的“下拉三角符号”,类似于下面这张图片文字后面三角符号的效果 下面是一个很简单的向上的三角形代码 #triangle-up { width: 0; height: ...
- (转)Java:按值传递和按引用传递详细解说
值传递和引用传递详解: 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public class TempTest { private void test1(int a ...
- Laravel学习笔记(四)数据库 数据库迁移案例
创建迁移 首先,让我们创建一个MySql数据库“Laravel_db”.接下来打开app/config目录下的database.php文件.请确保default键值是mysql: return arr ...
- Combobox
1.方式一 <select id="cc" class="easyui-combobox" name="dept" style=&qu ...
- mac-android-虚机加速
mac下进行android编程不可避免会碰到android虚拟机问题,macbook pro启动虚机时报错: Starting emulator for AVD 'NEW' emulator: ERR ...
- poi导出excel通用类
一.关键的通用类public class PoiExportUtils { private static HSSFWorkbook workBook; public PoiExportUtils ...
- 【cocos2d-js官方文档】一、搭建 Cocos2d-JS 开发环境
http://blog.csdn.net/qinning199/article/details/40395085