在.NET架构的Winform项目中引入“异步编程”思想和技术

news2024/12/23 9:04:46

在.NET架构的Winform项目中引入“异步编程”思想和技术

  • 一、异步编程引入
    • (1)异步编程引入背景
    • (2)异步编程程序控制流图
    • (3)异步编程前置知识:
  • 二、异步编程demo
      • 步骤1:
      • 步骤2:
      • 步骤3:
      • 效果:

一、异步编程引入

(1)异步编程引入背景

在当今的软件开发领域,提升用户体验是至关重要的。通过采用异步编程,我们能够在不阻塞UI线程的同时,有效地处理I/O密集型任务或在后台线程中执行CPU密集型任务。这种方法不仅提高了程序的效率,还符合人体工程学原则,使得用户界面更加友好。

(2)异步编程程序控制流图

在这里插入图片描述

(3)异步编程前置知识:

进程:CPU(处理机)分配资源的最小单位

线程:CPU处理任务的最小单位

进程与线程的关系:

进程同步:多个进程上处理机运行具有顺序关系,前一个执行了后一个才能执行

进程互斥:某些资源同一时间只允许一个进程使用

I/O密集型任务:如打印机打印、网络I/O、磁盘I/O,任务的瓶颈是I/O系统的速度

CPU密集型任务:如复杂的数学计算、加密算法,任务的瓶颈是CPU的计算能力

C#中异步编程的三个主要对象:

  • async:用于声明当前函数是一个异步函数
  • await:用于标记异步函数的暂停点,只能在async声明的函数中使用
  • Task或Task<>:一个异步操作的类,用于执行异步操作

二、异步编程demo

目标框架:.NET Framework 4.7.2

针对的功能:磁盘I/O和网络I/O

步骤1:

将事件中的所有操作封装到一个异步函数中,这里以按钮的点击事件为例

原来的代码:

 private void button1_Click(object sender, EventArgs e)
 {
     //点击事件的代码逻辑
    
 }

封装后的代码:

 private void button1_Click(object sender, EventArgs e)
 {
     // 封装为函数,异步执行登录验证
     await LoginAsync();

     // 控制权交还给UI线程,此处可添加登录成功后的后续操操作
 }



 private async Task LoginAsync()
 {
     //点击事件的代码逻辑

 }

这里还演示了异步函数的调用,使用await关键字进行异步函数的异步调用,调用异步函数后,程序的控制权立即返回调用线程(UI线程),因此UI不会卡顿。

步骤2:

通过关键字async控件事件声明为异步事件

原来的代码

 private void button1_Click(object sender, EventArgs e)
 {
     
 }

修改后的代码

        private async void button1_Click(object sender, EventArgs e)
        {

        }

步骤3:

在封装的函数中调用服务的异步方法,这里以数据库服务为例,调用MySql.Data.MySqlClient中的异步数据库操作函数OpenAsyncExecuteReaderAsyncReadAsync

原来的代码:

con.Open();

 MySqlDataReader reader = cmd.ExecuteReader();
 
 // 检查是否有查询结果
 if (reader.Read())

修改后的代码:

await con.OpenAsync();

var reader = await cmd.ExecuteReaderAsync())
 
if (await reader.ReadAsync())
  

效果:

目前我的数据库连接字符串是一个错误的字符串,如果不引入异步编程,在登录时,程序从请求数据库连接,到数据库返回数据库连接的状态(成功/失败)这段时间内,UI是冻结的,不允许任何其他操作,也不允许移动窗体。但是在引入上述异步编程技术之后,UI不会冻结,用户体验感上升。

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

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

相关文章

『FPGA通信接口』DDR(4)DDR3内存条SODIMMs读写测试

文章目录 前言1.MIG IP核配置2.测试程序3.DDR应用4.传送门 前言 不论是DDR3颗粒还是DDR3内存条&#xff0c;xilinx都是通过MIG IP核实现FPGA与DDR的读写。本文区别于DDR颗粒&#xff0c;记录几个与颗粒配置不同的地方。关于DDR的原理与MIG IP的简介&#xff0c;请查看前面文章&…

商务分析方法与工具(三):Python的趣味快捷-循环控制结构解决随机摇奖

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

Debian 12 Bookworm Linux安装 NVIDIA驱动程序

运行带有 Nvidia 显卡的 Debian 12 Linux 台式机或笔记本电脑的用户将需要 Nvidia 驱动程序才能利用显卡的强大功能来执行游戏、3D 渲染、视频编辑和其他图形密集型任务。 因此&#xff0c;如果你不知道如何在 Debian Linux 上安装 NVIDIA GPU 驱动程序&#xff0c;请按照本教…

从零开始学习生成树实验:一步一步走向精通

大家好&#xff0c;这里是G-LAB IT实验室。 ⭕5月18日 CCNAHCIA 新开班来啦&#x1f44f; 现在报名有早鸟价&#xff0c;感兴趣的可咨询 &#x1f447;&#x1f447;&#x1f447; 敲重点! 可小窗客服咨询课程价格 本课程包含线下面授、线上直播、录播、实验、考试习题、…

AI技术赋能下的视频监控方案是如何解决新能源汽车充电难问题的?

一、方案背景 刚刚结束的第十八届北京车展异常火爆&#xff0c;其中一组与汽车有关的数字让人格外关注。根据乘联会2024年4月19日公布的最新数据&#xff0c;全国乘用车市场零售达到51.6万辆&#xff0c;其中新能源车的销量约为26万辆&#xff0c;市场渗透率达到50.39%。 这意味…

java-Spring-Lombok-讲解-(一文一言)创伤是成熟的途径

高手都在孤独前进-致敬我们不悔的青春 我打算每篇文章下找一下文言警句-说不那天会用上&#x1f601;&#x1f601;&#x1f601;&#x1f601; 每篇一言 创伤是成熟的途径 希望经历过创伤的人,能更好享受当下, 爱自己胜过爱别人呀 目录 &#x1f3bb;Lombok简介 &#…

【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计

前言 从今天开始&#xff0c;我们详解介绍制作实时天气时钟项目的方法步骤&#xff0c;主要分以下几个专题分别进行&#xff1a;&#xff08;1&#xff09;连接点亮SPI-TFT屏幕和UI布局设计&#xff1b;&#xff08;2&#xff09;NodeMCU的WIFI模式设置及连接&#xff1b;&…

线上线下包搭建小程序/公众号/H5 支持二开!

网上交友有以下三个积极影响&#xff1a; 1. 扩展社交圈和增加社交机会&#xff1a;网上交友可以让人们接触到不同地区、不同背景、不同文化的人&#xff0c;拓展人们的社交圈并且增加交友机会。这些新的社交联系对于个人的成长和发展有积极的影响&#xff0c;可以让人们学习新…

武汉理工大学python123实验——流程控制结构

1.百分制成绩转换五分制#1707 n int(input())if n>90:print(A) elif n>80:print(B) elif n>70:print(C) elif n>60:print(D) else:print(E) 2.角古猜想#73963 n eval(input()) if n<0:print(ERROR) elif . in str(n):print(ERROR) else:print(n,end" …

excel公式后面加的““是什么意思呢?

这个大体上有两种用意。 1.将数值转换成文本 VLOOKUP(F2,A:C,3,0) 举个使用VLOOKUP函数的场景&#xff0c;如下图所示&#xff0c;员工信息表A:C区域中&#xff0c;A列员工号是文本型数字&#xff0c;使用VLOOKUP函数查询找的时候&#xff0c;F列的员工号数值型、文本型都有…

虚幻引擎5 Gameplay框架(二)

Gameplay重要类及重要功能使用方法&#xff08;一&#xff09; 配置LOG类及PlayerController的网络机制 探索验证GamePlay重要函数、类的执行顺序与含义 我们定义自己的日志&#xff0c;专门建立一个存放自己日志的类&#xff0c;这个类继承自BlueprintFunctionLibrary 然后…

设备自动化技术商务咨询

​南京纳恩自动化科技有限公司&#xff0c;成立于 2010年。高新技术企业、软件企业&#xff0c;致力于为客户提供最佳的继电保护、电力监控、智慧用电、工业自动化系统以及基于大数据、云系统的产品解决方案和服务。 自动化行业深耕多年&#xff0c;成就丰富的电力自动化行业经…

第 8 章 机器人平台设计(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 8.2.3 arduino 基本语法演示 通信操作 1.通信实现01 需求&#xff1a; 通过串口&#xff0c;由 arduino 向…

【driver5】调用堆栈函数,printk,动态打印,ftrace,proc,sysfs

文章目录 1.内核函数调用堆栈&#xff1a;4个函数2.printk&#xff1a;cat /proc/cmdline查看consolettyS03.动态打印&#xff1a;printk是全局的且只能设打印等级&#xff0c;动态打印可控制选择模块的打印&#xff0c;在内核配置打开CONFIG_DYNAMIC_DEBUG4.ftrace&#xff1a…

深入剖析Tomcat(六) Tomcat各组件的生命周期控制

Catalina中有很多组件&#xff0c;像上一章提到的四种容器&#xff0c;载入器&#xff0c;映射器等都是一种组件。每个组件在对外提供服务之前都需要有个启动过程&#xff1b;组件在销毁之前&#xff0c;也需要有个关闭过程&#xff1b;例如servlet容器关闭时&#xff0c;需要调…

数据结构——图的基础知识与其表示

一&#xff1a;定义 由顶点的集合和边的集合组成&#xff1b;常以 G(V,E) 表示&#xff0c;G 代表图&#xff0c;V代表 顶点的集合&#xff0c;E代表边的集合&#xff1b; 如图&#xff1a; 在G1图中&#xff0c;有 0~4 五个顶点&#xff0c;有 0-1&#xff0c;0-2&…

文献速递:深度学习医学影像心脏疾病检测与诊断--从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测

Title 题目 Deep Learning Coronary Artery Calcium Scores from SPECT/CT Attenuation Maps Improve Prediction of Major Adverse Cardiac Events 从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测 01 文献速递介绍 低剂量非门控CT衰减校正&am…

Problem 5: Whack-A-Mole打地鼠

实战题&#xff1a;打地鼠 内容如附件所示&#xff1a; 测试数据为:1,2,4,8,9,10,11,14 答案为&#xff1a;10,2,4 原始分布&#xff1a; 击打10号 击打2号 击打4号 要求&#xff0c;所示实例解以图示的方式给出&#xff0c;并且5组测试数据都需要测试&#xff0c;…

力扣每日一练(螺旋矩阵)

54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,…

获取转转数据,研究完转转请求,tx在算法方面很友好。

本篇文章仅供学习讨论。 文章中涉及到的代码、实例&#xff0c;仅是个人日常学习研究的部分成果。 如有不当&#xff0c;请联系删除。 在研究完阿里的算法以后&#xff08;其实很难说研究完&#xff0c;还有很多内容没有研究透&#xff0c;只能说暂时告一段落&#xff09;&…