湖北营销型网站建设费用,网站搜什么关键词好,做网站例子,做pc网站会连带手机版前言#xff1a;
大家好#xff0c;我是上位机马工#xff0c;硕士毕业4年年入40万#xff0c;目前在一家自动化公司担任软件经理#xff0c;从事C#上位机软件开发8年以上#xff01;我们在开发C#程序的时候#xff0c;有时候需要在非Ui主线程更新界面#xff0c;为了…前言
大家好我是上位机马工硕士毕业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 i0;iint.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至于这两种方式分别在以下情况使用 1control.Invoke 对于程序执行速度要求不高的场合推荐使用这也是一般软件都使用的方式。 2control.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控件从入门到精通》