关于我们

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

< 返回新闻公共列表

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



相关阅读

云南选择外包网站建设的优势云南提升网站排名的两大要素云南优秀的商城网站都会拥有这几点云南APP与小程序之间的优劣对比云南给企业选择虚拟主机时的小建议云南网站推广的方式附带价格讲解云南国内外网站之间的差异在哪里云南网站内容更新的一些小建议云南如何得知企业网站是否该更新改版云南定制开发网站的好处在哪里MySQL的备份代码C++中删除文件夹及包含的文件的方法C中matlab集合操作方法模拟鼠标点击的方法代码vs 取文件大小 字节的方法Python连接数据库的API如何获取桌面路径的方法云南首个新餐饮云平台-翼通云新餐饮应疫情上线认识什么是js闭包Python3标准库:operator内置操作符的函数接口R语言入门:矩阵和数组的运算flutter的取得成功Flink 融合 Apollo,动态性升级 Flink 工作配备C3#中如何重写object虚方法应用Visual Studio Comunity 2019开发设计Unity C#脚本制作沒有全自动补齐的解决方案C#如何快速实现完整的INI文件读写类C#设定自定文件图标保持双击鼠标起动C#中实现保持文档拖拽开启的方式WPF:客户控制库应用資源词典的疑惑The finally block does not always execute in try finallyC#:checked unchecked初识DjangoEffective C#:基于任务的异步编程flex延展性盒模型合理布局你弄懂了吗?npm环境下如何安裝Vue.js熟悉vue目录结构初步学习Vue.js关于Vue.js的条件与循环vue循环语句使用v-for 指令Vue.js计算属性关键词:computedVue.js 监听属性:通过 watch 来响应数据的变化电脑浏览器中普遍的html词义化标识运用chrome的overrides实时调试网上jsnodejs对字符串数组开展base64变换和分析关于js中函数的默认值与动态参数arguments的总结jquery幻灯片淡入淡出组件封装node 上传照片到七牛jquery滑动效果的运动模块封装ES6:教你用js面向对象思维来实现 tab栏增删改查功能前端的js构造函数和原型通过H5C3完成响应式网页(VIVO官网)ES6中的class(类)如何正确使用pocsuite3Apache Solr JMX服务项目 RCE 系统漏洞重现SharePoint 总体目标浏览人群SharePoint 2016 建立空白页网站Apache Shiro 授权关于2020年JAVA大厂笔经面经分享idea激话实例教程(永久性)适用2019 3.1 测试Go技术性人民日报(2020java map中根据value排序取前nFlutter中的this和this.widget有何差别?应用pandas挑选出特定列值所相匹配的行关于C语言指针的学习总结Java面向对象C++中常见的涵数有哪些?python异常处理会使用到哪些关键字?java开发设计JSP学员成绩管理系统 源代码根据JSP+Servlet开发设计java商场平时智能管理系统源代码python3-cookbook认识python 初学者须知Java 比较器python3-cookbook我的潘多拉深入理解Java虚拟机中的垃圾回收云南旅游网站设计需要有那些内容云南商城网站的支付安全如何维护云南为什么我们都是不建议使用模板建站的原因云南网站建设之中最容易被忽视的读小细节云南企业网站要突显特色要建设那些栏目云南网站中不同的背景颜色代表什么云南网站优化之程序优化云南医疗行业网站建设的注意事项云南网站后期的运营费用组成部分云南手表行业网站设计要点C#与Windows Form之间正确传值方法代码C++中如何产生不重复的随机数非常使用的技巧:次要关键字排序方法Matlab字符串分割详情取模(mod)与取余(rem)是一样的吗?如何区分?matlab svd 和 eig 之间如何区分C#中使用PictureBox来播放视频的代码分享Linux中使用内存映射文件MMF实现大数据量导出时的内存优化关于3年多前端菜鸡的面试及知识梳理与总结PyCharm教程安装,Python开发人员的强有力专用工具《Java 8 in Action》Chapter 12:新的日期和时间API环球在线新闻中心杨主任对我司谭昱同志的表彰【第7篇】如何理解asp.net core 3.x Identity系统Visual Studio Code如何设置Blazor clientEF CORE中复杂类型的映射
/template/Home/Zkeys/PC/Static