关于我们

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

< 返回新闻公共列表

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



相关阅读

关于云计算的概念计算机网络技术基础知识云计算的优点和缺点服务器搭建计算机网络安全常见的危险因素有哪些?什么是内容分发网络(CDN)?云南服务器搭建和数据备份,恢复云南云服务器的三大作用人工智能AI初认识云计算服务的6个优势云南服务器托管有哪些注意事项Tomcat的特点云计算的三个优点选取小程序服务商时的注意事项不同数据库的不同区别什么是VPS主机它的优势是什么?你知道5G的优点和缺点吗?云南三级分销商城开发的目的和对企业的价值云南网站优化的3个方面和网页的优化我们晋级拉!!!云南网站链接维护的具体方法云南网站应该如何做优化云南网站维护的主要内容云南云服务器和虚拟主机的操作区别云服务器部署和注意点云南服务网器托管应该选择怎样的机房云南虚拟建设网站主机的优点和缺点云服务器和物理服务器的区别云服务器有哪些优势C# List用法 List介绍C#和Java有什么不同PHP的优点和缺点智慧新餐饮和传统餐饮的区别云数据库对比传统数据库有哪些优点裸金属服务器是什么它的作用是什么白盒测试的特点js中添加scriptjs中[]、{}、()的用法和区别php 字符串的整型转换ipa如何安装到苹果手机邓白氏码是什么?iOS开发者账号到期续费教程在C#中有哪些引用类型和值类型小程序搭建时需要准备些什么云数据库对比传统数据库的优势什么样的企业适合SEMjs中的常见错误C#数据类型转换字符串与数值之间的转换C#的几种循环遍历方式物联网是什么它和互联网又有什么区别?云南网站建设时应该注意些什么云计算是什么?它能干些什么?展望未来5G会给我们的生活带来哪些影响C#常见的几种报错类别C#的学习流程有哪些dedecms 绑定二级域名的正确方法SEM是什么它和SEO之间是什么关系?云南新餐饮料模式是如何运行的?云南网站建设初期应该注意哪些问题云南网站建设中原创文章对网站起什么作用Javascript中如何中断forEach循环云南零售小程序前景怎么样?如何优化WEB应用数据库访问慢的问题?Javascript中用let和var声明变量的区别是什么redis 的主从复制和哨兵?递归和迭代有何区别?<input> 标签的 readonly 属性怎么用?云南网站建设中网页版商城如何保证网站安全云南企业官网如何推广云南企业网站建设为什么把文章类型的栏目排在前面云南餐饮小程序能带给餐饮业什么?云南网站建设需要注意什么地方云南云服务器配置如何选择合适的云南网站建设和网站设计有何区别?云南网站建设—企业官网的好处在哪?云南做小程序的优势在哪?为什么建议做小程序?网站为什么要配置ssl证书?网站为什么要做seo,做seo有什么好处?微信小程序_企业付款到零钱 API 开发如何利用缓存提高asp.net网站访问速度中小型企业如何选择服务器配置?如何优化中小型企业网站C#.net做网站后台 需要记录日志基于asp.net企业门户网站设计霓裳民族服装seo优化分析建议Javascript的函数封装认识及使用Ajax请求中data与后端的交互有哪几种方法JavaScript如何实现组合模式???SQL之子查询的基本用法有哪些?什么是静态测试、动态测试、黑盒测试、白盒测试、α测试 β测试?C# 引入委托的目的是什么c# 委托的本质是什么C# DataGridView添加新行的2个方法C#支付宝扫码支付代码完整版c# MVC 微信支付教程系列之扫码支付代码实例Redis基础通用操作指令有哪些?String、StringBuffer和StringBuilder的各自用法常见的一些Dos命令有哪些?如何在C#中复制一个Windows窗体类前端js中的运算符的种类,=、==与===的有何区别?网站前端怎么设置页面禁止转载?
/template/Home/Zkeys/PC/Static