winform跨线程更新界面
前言:
大家好,我是上位机马工,硕士毕业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控件从入门到精通》
相关文章:
winform跨线程更新界面
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#程序的时候,有时候需要在非Ui主线程更新界面,为了…...
【合作原创】使用Termux搭建可以使用的生产力环境(二)
前言 上期文章没看的可以先从上期文章开始看起 【合作原创】使用Termux搭建可以使用的生产力环境(一)-CSDN博客 目前我们已经完成了FinalShell ssh连接手机Termux的功能了,这期我们继续朝我们的目标前进。今天早上有读者进群以为生成环境指…...
微积分复习笔记 Calculus Volume 2 - 3.3 Trigonometric Substitution
3.3 Trigonometric Substitution - Calculus Volume 2 | OpenStax...
vue2+svg+elementui实现花瓣图自定义el-select回显色卡图片
项目需要实现花瓣图,但是改图表在echarts,highCharts等案例中均未出现,有类似的韦恩图,但是和需求有所差距; 为实现该效果,静态图表上采取svg来手动绘制花瓣: 确定中心点,以该点为中…...
记录一次网关异常
记一次网关异常 网关时不时就会出现下面的异常。关键是不知道什么时候就会报错,并且有时候就算什么都不操作,也会导致这个异常。 ERROR org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in schedul…...
计算机网络——不同版本的 HTTP 协议
介绍 HTTP,即超文本传输协议(HyperText Transfer Protocol),是应用层的一个简单的请求-响应协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。本文将介绍 HTTP 协议各个版本。 HTTP/1.0 HTTP/1…...
使用 LLaMA-Factory 微调
git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e . pip install tf-keras[dataset_info.json](dataset_info.json) 包含了所有可用的数据集。如果您希望使用自定义数据集,请**务必**在 dataset_info.json 文件中添加*数据…...
vue2 虚拟DOM 和 真实DOM (概念、作用、Diff 算法)
虚拟 DOM 和 真实DOM(概念、作用、Diff 算法) 1.1 概念 真实 DOM(Document Object Model):是浏览器中用于表示文档结构的树形结构。 <h2>你好</h2>虚拟DOM:用 JavaScript 对象来模拟真实 DOM…...
GEOBench-VLM:专为地理空间任务设计的视觉-语言模型基准测试数据集
2024-11-29 ,由穆罕默德本扎耶德人工智能大学等机构创建了GEOBench-VLM数据集,目的评估视觉-语言模型(VLM)在地理空间任务中的表现。该数据集的推出填补了现有基准测试在地理空间应用中的空白,提供了超过10,000个经过人工验证的指…...
说说Elasticsearch查询语句如何提升权重?
大家好,我是锋哥。今天分享关于【说说Elasticsearch查询语句如何提升权重?】面试题。希望对大家有帮助; 说说Elasticsearch查询语句如何提升权重? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…...
2-2-18-9 QNX系统架构之文件系统(一)
阅读前言 本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个…...
Unity类银河战士恶魔城学习总结(P156 Audio Settings音频设置)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了音频的大小设置与保存加载 音频管理器 UI_VolumeSlider.cs 定义了 UI_VolumeSlider 类,用于处理与音频设置相关的…...
springboot vue 会员收银系统 (12)购物车关联服务人员 订单计算提成 开源
前言 完整版演示 http://120.26.95.195/ 开发版演示 http://120.26.95.195:8889/ 在之前的开发进程中,我们完成订单的挂单和取单功能,今天我们完成购物车关联服务人员,用户计算门店服务人员的提成。 1.商品关联服务人员 服务人员可以选择 一…...
P3916 图的遍历(Tarjan缩点和反向建边)
P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 写法一:Tarjan 思路:先运用Tarjan算法得到每个连通块中最大的编号,然后对每个连通块进行缩点重新建图,进行dfs,得到缩点后的连通块能够达到的最大编号。 Code: conste…...
Android13 允许桌面自动旋转
一)需求-场景 Android13 实现允许桌面自动旋转 Android13 版本开始后,支持屏幕自动旋转,优化体验和兼容性,适配不同屏幕 主界面可自动旋转 二)参考资料 android framework13-launcher3【06手机旋转问题】 Launcher默…...
cocotb value cocotb—基础语法对照篇
cocotb—基础语法对照篇 import cocotb from cocotb.triggers import Timer from adder_model import adder_model from cocotb.clock import Clock from cocotb.triggers import RisingEdge import randomcocotb.test() async def adder_basic_test(dut):"""Te…...
001-SpringBoot整合日志
SpringBoot整合日志 一、引入依赖二、配置 application.yml三、配置文件 logback.xml四、配置文件 WebConfigurerAdapter五、配置常量文件六、配置拦截器七、效果展示一、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId&…...
【Java基础面试题011】什么是Java中的自动装箱和拆箱?
相关知识补充:《Java从入门到精通(JDK17版)》_尚硅谷电子书.pdf Autism_Btkrsr/Blog_md_to_pdf - 码云 - 开源中国 (gitee.com) 回答重点 自动装箱:Java编译器自动将基本数据类型转换为包装类型 自动拆箱:Java编译器自动将包装类转换为基…...
ERROR in [eslint] Invalid Options ‘extensions‘ has been removed.
看着这个报错 感觉是版本不对引起的 ERROR in [eslint] Invalid Options: - Unknown options: extensions - extensions has been removed. ERROR in Error: Child compilation failed: [eslint] Invalid Options: - Unknown options: extensions - extensions has b…...
消息传递神经网络(Message Passing Neural Networks, MPNN)
消息传递神经网络(Message Passing Neural Networks, MPNN) 一、引言二、消息传递框架概述1.消息传递阶段(1)消息生成与传播-message(2)消息聚合-aggregate(3)消息更新-update&#…...
FCEUX:专业级NES模拟器的深度探索与实战应用
FCEUX:专业级NES模拟器的深度探索与实战应用 【免费下载链接】fceux FCEUX, a NES Emulator 项目地址: https://gitcode.com/gh_mirrors/fc/fceux 🚀 在复古游戏复兴与技术考古的浪潮中,FCEUX以其卓越的专业性脱颖而出,成为…...
Super IO:Blender批量导入导出终极指南,工作效率提升300%
Super IO:Blender批量导入导出终极指南,工作效率提升300% 【免费下载链接】super_io blender addon for copy paste import / export 项目地址: https://gitcode.com/gh_mirrors/su/super_io Super IO是一款革命性的Blender插件,它通过…...
Unity UGUI循环列表优化指南:SuperScrollView原理与实战
1. 为什么一个“滚动列表”值得单独写一篇工具指南? 在Unity UGUI项目里,我见过太多团队把“显示几十条数据”当成小功能随手写——用Scroll View拖个Content,写个for循环Instantiate prefab,加个Layout Group排版,再…...
观测通过Taotoken调用大模型API的延迟与用量消耗体验
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观测通过Taotoken调用大模型API的延迟与用量消耗体验 在开发工作中引入大模型能力,例如自动生成代码注释,已…...
百度网盘Mac版破解插件:免费解锁SVIP高速下载完整指南
百度网盘Mac版破解插件:免费解锁SVIP高速下载完整指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘Mac版下载速度缓慢而困…...
告别手动下载烦恼!DouK-Downloader让抖音/TikTok数据采集变得简单
告别手动下载烦恼!DouK-Downloader让抖音/TikTok数据采集变得简单 【免费下载链接】TikTokDownloader TikTok 发布/喜欢/合辑/直播/视频/图集/音乐;抖音发布/喜欢/收藏/收藏夹/视频/图集/实况/直播/音乐/合集/评论/账号/搜索/热榜数据采集工具/下载工具 …...
告别手动转换:docx2tex如何让Word到LaTeX的转换变得简单高效
告别手动转换:docx2tex如何让Word到LaTeX的转换变得简单高效 【免费下载链接】docx2tex Converts Microsoft Word docx to LaTeX 项目地址: https://gitcode.com/gh_mirrors/do/docx2tex 还在为Word文档转换为LaTeX格式而烦恼吗?每次手动调整格式…...
FactoryBluePrints项目深度解析:戴森球计划终极工厂蓝图优化指南
FactoryBluePrints项目深度解析:戴森球计划终极工厂蓝图优化指南 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints项目是戴森球计划游戏中最为…...
第P5周:Pytorch实现运动鞋识别
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 个人体悟:今天学习了动态学习率有种豁然开朗的感觉,在引入该部分之后模型的学习速度和学习质量都得到了较大提升!...
Claude处理1000+页合同文档的7步标准化流程:从乱码识别到条款抽取全链路实操
更多请点击: https://kaifayun.com 第一章:Claude处理1000页合同文档的7步标准化流程总览 面对动辄上千页的复杂商业合同(如并购协议、跨境服务主协议、多层分包合同包),人工审阅极易遗漏关键条款、时效性差且难以复现…...
