C# - 异步编程和同步编程总结

在Windows Forms或WPF等桌面应用中,Invoke 和 BeginInvoke 是用来在创建控件的UI线程上安全地执行代码的关键方法,主要是为了处理多线程环境下的UI交互。

  • Invoke: 它是一个同步操作。当你调用 Invoke 时,当前线程会被阻塞,直到UI线程执行完传递给它的委托(Lambda表达式或Delegate实例)。这种方式适用于需要保证执行顺序且不介意短暂阻塞当前线程的情况。

  • BeginInvoke: 另一方面,BeginInvoke 是一个异步操作。它将操作添加到UI线程的消息队列中并立即返回,不会等待执行完成。因此,当前线程不会被阻塞,可以继续执行后续代码。但是,由于非阻塞特性,BeginInvoke 不保证操作的执行顺序,如果有多个调用,它们可能会按照不同的顺序执行。在性能敏感或无序执行不影响逻辑的情况下,应优先考虑使用 BeginInvoke

异步编程

1.说明

var result = await Task.Run(() =>
{});

2.举例 

var result = await Task.Run(() =>
{// 更新textBox1if (this.textBox1.InvokeRequired){this.textBox1.BeginInvoke(new Action(() =>{this.textBox1.Text = "成品仓-" + name1;}));}else{this.textBox1.Text = "成品仓-" + name1;}// 更新verticalProgressBar1if (this.verticalProgressBar1.InvokeRequired){this.verticalProgressBar1.BeginInvoke(new Action(() =>{this.verticalProgressBar1.Value = Convert.ToInt32(progress);}));}else{this.verticalProgressBar1.Value = Convert.ToInt32(progress);}// 更新label1if (this.label1.InvokeRequired){this.label1.BeginInvoke(new Action(() =>{this.label1.Text = Convert.ToInt32(progress) + "%";}));}else{this.label1.Text = Convert.ToInt32(progress) + "%";}// 更新dataGridView2 DataSourceif (this.dataGridView2.InvokeRequired){this.dataGridView2.BeginInvoke(new Action(() =>{this.dataGridView2.DataSource = datatable2;}));}else{this.dataGridView2.DataSource = datatable2;}
});
 3.异步编程出现的问题
1.System.InvalidOperationException:“线程间操作无效: 从不是创建控件“”的线程访问它。”
 this.textBox1.BeginInvoke(new Action(() =>{}));
2.System.InvalidOperationException:“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”
if (this.textBox1.InvokeRequired)
{}
else
{}

2.同步编程 

Invoke(new Action(() => ... )) 

举例 

 Invoke(new Action(() =>{// 清空文本框等UI元素ClearUiElements();}));

总结来说,Invoke 适合需要保证顺序和同步的简单场景,而 BeginInvoke 更适用于复杂情况,当你希望保持当前线程的活跃,不关心执行顺序或能够处理潜在的并发问题时。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark项目通用开发框架

文章目录 1. 大数据项目结构2. 类说明2.1 公共接口类2.2 TaskNameEnum指定每个任务的名称2.3 TaskRunner中编写任务的业务逻辑 3. 任务执行脚本 每个公司内部都有一套自己的架子,一般新人来了就直接在已有的架子上开发业务。 以下仅仅作为记录下自己使用的架子&…

16_网络IPC1-套接字描述符

用户数据报协议(UDP) 与 传输控制协议(TCP) 文件描述符函数使用套接字的行为 禁止套接字IO

vue 自定义滚动条同步拖动(移动端)

实现效果&#xff0c;拖动左右箭头实现图片区域同步滚动&#xff0c;到边缘停止拖动。 HTML代码 <template><div touchstart"onClick"><!--使用draggable组件 图片列表区域--><draggablev-model"select_list"end"onEnd"cl…

[Windows] 无需PS基础也香 Inpaint v10.2高级便携版

描述 对于经常在互联网上进行操作的学生&#xff0c;白领等&#xff01; 一款好用的软件总是能得心应手&#xff0c;事半功倍。 今天给大家带了一款高科技软件 Inpaint v10.2高级便携版 无需额外付费&#xff0c;永久免费&#xff01; 亲测可运行&#xff01;&#xff01; 内容…

AV1 编码标准中帧内预测技术概述

AV1 编码标准帧内预测 AV1&#xff08;AOMedia Video 1&#xff09;是一种开源的视频编码格式&#xff0c;旨在提供比现有标准更高的压缩效率和更好的视频质量。在帧内预测方面&#xff0c;AV1相较于其前身VP9和其他编解码标准&#xff0c;如H.264/AVC和H.265/HEVC&#xff0c;…

EMR 集群时钟同步问题及解决方案An error occurred (InvalidSignatureException)

目录 1. 问题描述2. 问题原因3. 解决过程4. 时钟同步的重要性5. Linux 系统中的时钟同步方式6. 检查 Linux 系统时钟同步状态7. EMR 集群中的时钟同步配置8. 时钟同步对大数据组件的影响9. 监控和告警策略10. 故障排除和最佳实践11. 自动化时钟同步管理12. 时钟同步与数据一致性…

【设计模式之美】【建造型】工厂模式实战:如何设计一个DI框架;梳理流程,通过面向接口解耦对象创建

文章目录 一. 工厂模式和 DI 容器有何区别&#xff1f;二. DI 容器的核心功能有哪些&#xff1f;1. 配置解析&#xff1a;解耦对象创建2. 对象创建3. 对象的生命周期管理 三. 如何实现一个简单的 DI 容器&#xff1f;1. 最小原型设计&#xff1a;流程梳理2. 提供执行入口&#…

GESP C++ 三级真题(2023年9月)T1 ⼩ 杨储蓄

1、 ⼩ 杨储蓄 问题描述 ⼩ 杨共有 N个储蓄罐&#xff0c;编号从0到N-1。从第1天开始&#xff0c; ⼩杨每天都会往存钱罐里 存钱。具体来说&#xff0c;第i天他会挑选一个存钱罐 ɑ i &#xff0c;并存 ⼊i元钱。过了D天后&#xff0c;他 已经忘记每个储蓄罐里都存了多少钱了&a…

git列出提交记录的文件路径

一、如何列出某次提交记录中修改过/新增的文件&#xff1f; 方法1&#xff1a;使用 git diff-tree 命令来查看某个提交记录中修改过/新增的文件。具体来说&#xff0c;你可以使用以下命令&#xff1a; git diff-tree --no-commit-id --name-only -r <commit-hash>命令解…

C++20中的constinit说明符

constinit说明符断言(assert)变量具有静态初始化&#xff0c;即零初始化和常量初始化(zero initialization and constant initialization)&#xff0c;否则程序格式不正确(program is ill-formed)。 constinit说明符声明具有静态或线程存储持续时间(thread storage duration)的…

机器人及其相关工科专业课程体系

机器人及其相关工科专业课程体系 前言传统工科专业机械工程自动化/控制工程计算机科学与技术 新兴工科专业智能制造人工智能机器人工程 总结Reference: 前言 机器人工程专业是一个多领域交叉的前沿学科&#xff0c;涉及自然科学、工程技术、社会科学、人文科学等相关学科的理论…

ozon俄罗斯ceo丨ozon平台数据分析选品神器

ozon俄罗斯ceo是玛依妮加文特。‌作为俄罗斯最大的电子商务公司Ozon Holdings的女首席执行官&#xff0c;‌玛依妮加文特被称为俄罗斯的杰夫贝索斯&#xff08;‌亚马逊CEO&#xff09;‌。‌她在公司中发挥着重要作用&#xff0c;‌不仅负责公司的日常运营和管理&#xff0c;‌…

修改表格颜色

el-table修改表头、列的背景颜色、字体样式_el-table-column背景颜色-CSDN博客 设置表头背景颜色&#xff0c;字体 <el-table :header-cell-style"rowClass" border :data"tableDataTwo" style"width: 100%"><el-table-column width&q…

数据结构初阶(C语言)-顺序表

一&#xff0c;线性表 在进行顺序表的介绍之前&#xff0c;我们先来了解下什么是线性表&#xff1a; 线性表是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串...线性表在…

2. 白盒测试

白盒测试 1. 白盒测试定义 测试软件的内部编码和基础设施&#xff0c;重点是根据预期和期望的输出检查预定义的输入。它基于应用程序的内部工作方式&#xff0c;并围绕内部结构测试。在这种类型的测试中&#xff0c;编程测试用例需要编程技巧。白盒测试的主要目标是通过软件关…

秒懂设计模式--学习笔记(9)【结构型-装饰器模式】

目录 8、装饰器模式8.1 装饰器模式&#xff08;Decorator&#xff09;8.2 装修&#xff08;举例&#xff09;8.3 化妆&#xff08;示例&#xff09;8.4 化妆品的多样化8.5 装饰器8.6 自由嵌套8.7 装饰器模式的各角色定义8.8 装饰器模式 8、装饰器模式 8.1 装饰器模式&#xff…

MySQL运维实战之ProxySQL(9.6)SQL黑名单

作者&#xff1a;俊达 利用mysql_query_rules表中的error_msg字段&#xff0c;可以实现SQL黑名单的功能。如果规则设置了error_msg&#xff0c;当SQL语句匹配这条规则时&#xff0c;proxysql会直接将error_msg的内容返回给客户端。 当遇到一些大查询严重影响数据库性能时&…

【开源项目】Rust开发复制文件夹目录结构工具

说明 由于我经常需要在多个大容量的移动硬盘中查找和新增文件&#xff0c;我希望把硬盘的目录结构放到服务器的自建网盘中&#xff0c;因此开发了这个工具&#xff0c;使得在不同硬盘之间的文件管理变得更加便捷 项目地址&#xff1a;https://github.com/VinciYan/folder_clon…

红色文化3D虚拟数字展馆搭建意义深远

在房地产与土地市场的浪潮中&#xff0c;无论是新城规划、乡村振兴&#xff0c;还是商圈建设&#xff0c;借助VR全景制作、虚拟现实和web3d开发技术打造的全链条无缝VR看房新体验。不仅极大提升了带看与成交的转化率&#xff0c;更让购房者足不出户&#xff0c;即可享受身临其境…

Linux Cgroups

Linux CGroup全称Linux Control Group&#xff0c; 是Linux内核的一个功能&#xff0c;用来限制&#xff0c;控制与分离一个进程组群的资源&#xff08;如CPU、内存、磁盘输入输出等&#xff09;。这个项目最早是由Google的工程师在2006年发起&#xff08;主要是Paul Menage和R…