当前位置: 首页 > news >正文

佛山新网站建设特色vs网页设计教程

佛山新网站建设特色,vs网页设计教程,怎样制作单页网站,大公司 wordpress前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#程序的时候,有时候需要在非Ui主线程更新界面,为了…

前言:

大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#程序的时候,有时候需要在非Ui主线程更新界面,为了避免跨线程更新ui的异常,下面进行详细介绍如何实现这一需求!

1、报错代码

下面的代码中的this.Text指的是一个winform的窗体,开启Task执行下面的代码以后直接报错,提示线程间操作无效,这是因为在WinForms应用程序中,UI元素(如控件)通常只能在创建它们的线程(通常是主线程或UI线程)上进行操作。如果你尝试从另一个线程更新UI元素,将会引发跨线程操作异常(InvalidOperationException)。为了安全地从非UI线程更新UI,你需要使用Invoke或BeginInvoke方法将更新操作封送回UI线程。

private void Test(){for(int i=0;i<int.MaxValue;i++){this.Text  = i.ToString();Thread.Sleep(1000);}}
   Task.Run(Test);

在这里插入图片描述

2、偷懒方法(不推荐)

在程序开始执行前设置下面的属性,意思就是不检查非UI线程访问UI,这样设置以后程序也不会报错,但是从众多查阅的资料可以得出该方法并不可靠,在多个线程同时并发访问控件时,可能会导致死锁,数据不一致等异常情况,所以并不推荐使用。

 CheckForIllegalCrossThreadCalls = false;

3、正确方法(推荐)

3.1 control.Invoke(一般都是采用这种方式)

下面的代码中this代表当前form窗体,Invoke方法里面传入的是一个委托,这里Action就是一个委托,Action委托绑定的方法通过lamada表达式实现,lamada表达式绑定的内容就是更新 this.Text的值。 control.Invoke的作用就是在创建控件的基础句柄所在线程上执行委托,也就是control.Invoke里面的委托更新ui的操作会被切换到ui线程执行,虽然调用 control.Invoke的代码不在ui线程,而且必须是ui线程的代码执行完了以后,才会重新切换到调用线程。

      private void Test(){this.Invoke(new Action(() =>{this.Text = "100";Console.WriteLine("委托执行完成");Thread.Sleep(1000);}));Console.WriteLine("Test方法执行完成");}
   Task.Run(Test);

输出:

委托执行完成
Test方法执行完成

从上面的输出可以看出 this.Invoke绑定的委托在ui线程执行完成以后,才返回到调用线程执行Console.WriteLine(“Test方法执行完成”);,这也称为同步调用。

3.2 control.BeginInvoke

下面的代码中this代表当前form窗体,BeginInvoke 方法里面传入的是一个委托,这里Action就是一个委托,Action委托绑定的方法通过lamada表达式实现,lamada表达式绑定的内容就是更新 this.Text的值。 control.BeginInvoke 的作用就是在创建控件的基础句柄所在线程上异步执行委托,也就是control.BeginInvoke里面的委托更新ui的操作会被切换到ui线程执行,同时BeginInvoke方法立即返回,接着执行调用线程后面的代码,而不是等到BeginInvoke绑定的委托执行完成以后才执行。

   private void Test(){this.BeginInvoke (new Action(() =>{this.Text = "100";Console.WriteLine("委托执行完成");Thread.Sleep(1000);}));Console.WriteLine("Test方法执行完成");}
   Task.Run(Test);

输出:

Test方法执行完成
委托执行完成

从上面的输出可以看出 this.BeginInvoke绑定的委托在ui线程执行的同时,也在调用线程执行Console.WriteLine(“Test方法执行完成”);,也就是说这两个线程并行执行,这也称为异步调用。

总结:对于winform跨线程更新界面推荐使用control.Invoke、 control.BeginInvoke,至于这两种方式分别在以下情况使用:
1)control.Invoke
对于程序执行速度要求不高的场合,推荐使用,这也是一般软件都使用的方式。
2)control.BeginInvoke
对于程序执行速度要求很高的场合,推荐使用,但是也有缺点,缺点就是具体界面在何时刷新我们是不知道的。

作者介绍

马工2017年硕士毕业,一直从事上位机软件开发工作,在我工作的第四年年薪突破了40万+,为了帮助跟我一样从底层出身的上位机软件工程师早日达到高级工程师的水平,早日找到30万+的工作,我根据多年项目经验,总结出了一系列可直接用于项目的C#上位机实战教程推荐给大家,目前在CSDN已经超过一千人订阅,如果你不甘贫庸,想像我一样早日拿到高薪,马工强烈推荐你早日学这套教程,雷军曾说这个世界上有99%的问题别人都遇到过,你要做的不是闷头干!而是找这个领域的专家问一下,这是最快速提升自己的方法!

年入30万+C#上位机实战必备教程推荐(点击下方链接即可访问文章)

1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》

http://www.yayakq.cn/news/212015/

相关文章:

  • 怎么才算完成一个网站私域运营
  • 食品网站建设规划书做网站需要服务器
  • html网站开发流程做a动漫视频在线观看网站
  • 长沙外贸网站建设做视频网站要什么
  • 网站中常用的功能模块青海省住房和城乡建设局网站首页
  • 宁波专业做网站的公司哪家好长沙高升小区做汽车行业网站的网络公司论天心区网页设计
  • 唐山网站建设托管网站制作佛山
  • 长春网站建设培训班深圳app搭建
  • 建设局网站安徽pythom 网站开发规范
  • 网站推广优化价格网站首页焦点图
  • 电话号码查询公司单位郑州seo外包收费标准
  • 邳州做网站软件工程师40岁后的出路
  • 建设银行天津分行门户网站wordpress H1 title
  • 一个网站是怎么建立的互联网公司排名1000
  • 网站空间 php程序动态ip可以做网站吗
  • 网站建设微信运营推广德州哪里有做网站的
  • 2014年网站开发语言企业网站案例分析
  • 旅游网站建设与翻译手机网站比例尺寸
  • 如何查询自己的网站是否被收录自己如何免费制作一个网站
  • 网站设计大作业创意设计网站推荐
  • 建站公司互橙知乎媒体平台推广
  • 怎么将自己做的网站上线wordpress怎么上传到服务器错误
  • 云南城乡建设厅网站苏州建设工程信息网站
  • 做移动网站快速做网站的把网站写成一行
  • 手机建站平台淘客怎么做线上营销
  • 天河网站建设优化网站ome系统怎么做
  • 北京怎样建设公司网站织梦做网站好不好
  • 代做网站灰色关键词专业网站设计公司地址
  • 给小孩做辅食的网站织梦网站图片代码
  • 网站抄袭我网站酒店网站开发