关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

c#多线程更新窗口GUI的数据详情

发布时间:2020-02-14 18:36:14

1. 在.net framwork 2.0中,可以通过以下代码来实现:


private delegate void SetControlPropertyThreadSafeDelegate(Control control, string propertyName, object propertyValue);

public static void SetControlPropertyThreadSafe(Control control, string propertyName, object propertyValue)

{

   if (control.InvokeRequired)

   {

     control.Invoke( new SetControlPropertyThreadSafeDelegate(SetControlPropertyThreadSafe), new object [] { control, propertyName, propertyValue });

   }

   else

   {

     control.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null , control, new object [] { propertyValue });

   }

}

  调用方式如下:  



// thread-safe equivalent of

// myLabel.Text = status;

SetControlPropertyThreadSafe(myLabel, "Text" , status);

2.在.net 3.0或者更新的版本中,你可以重写上面的方法作为一个Control类的扩展方法,可以简化调用方式,具体代码如下:  


1

myLabel.SetPropertyThreadSafe( "Text" , status);

 在.net 3.0以上的版本完整的调用步骤如下:



private delegate void SetPropertyThreadSafeDelegate<TResult>(Control @ this , Expression<Func<TResult>> property, TResult value);

public static void SetPropertyThreadSafe<TResult>( this Control @ this , Expression<Func<TResult>> property, TResult value)

{

   var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo;

   if (propertyInfo == null ||

       !@ this .GetType().IsSubclassOf(propertyInfo.ReflectedType) ||

       @ this .GetType().GetProperty(propertyInfo.Name, propertyInfo.PropertyType) == null )

   {

     throw new ArgumentException( "The lambda expression 'property' must reference a valid property on this Control." );

   }

   if (@ this .InvokeRequired)

   {

     @ this .Invoke( new SetPropertyThreadSafeDelegate<TResult>(SetPropertyThreadSafe), new object [] { @ this , property, value });

   }

   else

   {

     @ this .GetType().InvokeMember(propertyInfo.Name, BindingFlags.SetProperty, null , @ this , new object [] { value });

   }

}

   通过使用LINQ和lambda表达式使代码更加简洁:  


myLabel.SetPropertyThreadSafe(() => myLabel.Text, status); // status has to be a string or this will fail to compile

3.最简单的匿名方法调用:



///...blah blah updating files

string newText = "abc" ; // running on worker thread

this .Invoke((MethodInvoker) delegate {

     someLabel.Text = newText; // runs on UI thread

});

///...blah blah more updating files



相关阅读

云南医院网站建设的基本原则云南物流网站建设中更有利后期发展的几个重点云南建设移动网站的意义云南个人网站开发步骤云南手机网站建设价格明细云南与商城网站建设费用有关的因素云南电子商务网站的建设要点云南网站建设的规划应该有那些环节云南购物网站设计需求云南详细介绍站内的四种链接C#中有关于Split使用方面的代码实例如下C#中如何读取XML文件的代码方法关于c#son<--1-->的代码文件详细解析mysql数据库中特殊条件查询语句如下SQL数据库相关知识分享objective-C中的字符串拼接方法分享JS正则表达式详细解析云南如何保证企业网站的安全云南网站页脚设计的小技巧云南七个非常实用的网站排版建议云南文字排版在网站设计中的运用云南网站的测试流程有哪些云南网站设计底部应该有哪些内容云南建设APP时的注意事项云南企业网站建设完成之后的流程是什么云南移动网站建设的重点:云南优质手机网站需要具备那些条件代码注释的几种写法微信支付集成构建步骤错误代码集合的解决方法JS的正则表达式SQL 常用的语句C# 实现扫码二维码登录的难点讲解C#面对对象的资料库心得分享$jQuery 源码解析动画模块 便捷动画详解头部布局搜索验证和AJAX自动搜索提示并封装成组件提高代码复用性前端开发之学习CSS之用CSS实现时钟效果树莓派2_3点亮LED灯需要几行代码3行小孩子都能学会List集合去重各种方式汇总数据请说话css3新增边框阴影边框背景文本字体JavaScript之DOM基础css常用元素通用样式表vuex知识笔记及与localStorage和sessionStorage的区别js-JavaScript中数组和对象的遍历方法总结用正则的方法验证ipv4地址html制作一个照片墙的方法萌娘百科上的黑幕实现编程开发那些事?进程、线程、协程编程开发那些事 注解(Annotation)基于 H5 Canvas 及 3D 组态实现楼宇新风系统推送技术 ajax轮询 WebSocket以及socketIO的使用从实战角度超级详解中大型企业微服务化的六大核心关键技术Java 如何 添加、读取、删除Excel图片?Angular 从入坑到挖坑RX.js6变化前端菜鸟面试知识梳理有一定作用css如何改变css伪元素的样式css中元素显示方式实测vue 路由过渡动效揭秘阿里、腾讯、字节跳动在家办公的区别Linux下使用Tomcat6_Tomcat72020年学 Python 还有价值吗?这 100 道 Python 题,拿去刷c++ 的变量和基本类型微服务架构Sleuth(zipkin) 服务链路追踪php数据库嵌套查询之mongodb中进行嵌套查询package com.hhh.quartz;import org.quartz定时任务Quartz入门Mybatis缓存源码阅读java高并发-从源码角度分析创建线程池究竟有哪些方式物联网开发Thingsboard之MQTT设备协议简介Ubuntu安装软件时报 Unable to acquire the dpkg frontend lock解决方案Python2.7_3.5_3.6_3.7_3.8 使用OS模块调用 cmdlinux中安装msql2017 linux 使用Docker 部署mssql 2017.net core 轻量级容器 ServiceProvider 源码分析ASP.NET MVC——CodeFirst开发模式C#制作Wincc组件进行配方管理多线程实现的那些方法asp.net C#解释器模式.net core 3 web api 报404错误2020 年 中国.NET开发者调查报告Winfrom 减少控件重绘闪烁的方法WPF 自定义控件在MenuItem上使用RadioButtonOAuth2.0 QQ 授权认证 IdentityServer4vs2019 asp.net core 3.x 授权中的概念asp.net C#后台异步消息队列实现HTTP协议-Request&Responseselenium获取缓存数据R语言入门:向量初探几个点认识Nginx服务器React Native集成声网Agora语音通讯Django复制记录的方法Django中更新多个对象数据与删除对象的方法Django如何连接mysqlRedis5.x两种持久化方式以及主从复制配置基于SSM开发学生信息管理系统源码TomCat控制台中文乱码及IDEA设置为UTF为spring cloud config实现刷新动态掉的坑git常用命令python3-cookbook-python3apache-maven-3.6.2-配置Maven环境
/template/Home/Zkeys/PC/Static