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

在.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.mzph.cn/web/7376.shtml

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

相关文章

Kafka源码分析(五) - Server端 - 基于时间轮的延时组件

系列文章目录 Kafka源码分析-目录 一. 背景 Kafka内部涉及大量的"延时"操作&#xff0c;比如收到PRODUCE请求后可为副本等待一个timeout的时间后再响应客户端。 那我们讨论一个问题&#xff1a;Kafka为什么自己实现了一个延时任务组件&#xff0c;而不直接使用ja…

微信个人号开发api接口-视频号矩阵接口-VIdeosApi

友情链接&#xff1a;VIdeosApi 获取用户主页 接口地址&#xff1a; http://api.videosapi.com/finder/v2/api/finder/userPage 入参 { "appId": "{{appid}}", "lastBuffer": "", "toUserName": "v2_060000231003b2…

「PHP系列」PHP MySQL 预处理语句/读取数据/Where子句

文章目录 一、PHP MySQL 预处理语句二、PHP MySQL 读取数据三、PHP MySQL Where子句四、相关链接 一、PHP MySQL 预处理语句 在 PHP 中使用 MySQL 预处理语句&#xff08;prepared statements&#xff09;是一种推荐的方式来执行数据库操作&#xff0c;特别是当涉及到用户输入…

网络基础-华为VRP基础CLI操作

基本命令模式 华为设备的命令行模式包括用户视图和特权级模式。 用户视图&#xff08;User View&#xff09;&#xff1a;这是用户登录到华为设备时默认进入的模式。在用户视图下&#xff0c;用户可以执行一些基本的查看命令&#xff0c;但不能进行设备配置或管理。提示符通常…

Golang | Leetcode Golang题解之第72题编辑距离

题目&#xff1a; 题解&#xff1a; func minDistance(word1 string, word2 string) int {m, n : len(word1), len(word2)dp : make([][]int, m1)for i : range dp {dp[i] make([]int, n1)}for i : 0; i < m1; i {dp[i][0] i // word1[i] 变成 word2[0], 删掉 word1[i], …

U盘提示“被写保护”无法操作处理怎么办?

今天在使用U盘复制拷贝文件时&#xff0c;U盘出现“U盘被写保护”提示&#xff0c;导致U盘明明有空闲内存却无法复制的情况。这种情况很常见&#xff0c;很多人在插入U盘到电脑后&#xff0c;会出现"U盘被写保护"的提示&#xff0c;导致无法进行删除、保存、复制等操…

Junit 测试中如何对异常进行断言

本文对在 Junit 测试中如何对异常进行断言的几种方法进行说明。 使用 Junit 5 如果你使用 Junit 5 的话&#xff0c;你可以直接使用 assertThrows 方法来对异常进行断言。 代码如下&#xff1a; Exception exception assertThrows(NumberFormatException.class, () -> {n…

pycharm关闭代码补全

pycharm关闭代码补全 文件-设置 编辑器-常规-代码补全-键入时显示建议

pyecharts绘制世界动态轨迹图(v0.5.X与v1.X版本对比)

一、问题引入 pyecharts官网&#xff1a;https://pyecharts.org/#/zh-cn/intro 在使用Geo或者GeoLines绘制动态轨迹图时&#xff0c;如果所选地区是中国的省份或者城市&#xff0c;是能够匹配到对应的经纬度并且正常绘制的&#xff1b;如果所选地区涉及到其他国家或者国外城市&…

监控公司局域网电脑的软件|局域网电脑监控软件哪个好用

想要监控公司局域网电脑&#xff1f;没问题&#xff0c;市面上有一大堆选择等着你&#xff01;每个软件都有它的独门绝技和适用场合&#xff0c;接下来就让我带你看看哪些软件既好用又功能强大吧&#xff01; &#x1f389;OpManager&#xff1a; 这位大佬适合中大型企业&#…

C语言 | Leetcode C语言题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; void setZeroes(int** matrix, int matrixSize, int* matrixColSize) {int m matrixSize;int n matrixColSize[0];int flag_col0 false;for (int i 0; i < m; i) {if (!matrix[i][0]) {flag_col0 true;}for (int j 1; j < n; j…

【go从入门到精通】由检查一个空结构体引发的思考?

作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢你的关注…

用wordpress为外贸进出口公司搭建多语言国际站

使用WordPress为外贸进出口公司搭建多语言国际站是一个很好的选择&#xff0c;因为WordPress不仅易于使用&#xff0c;而且具有丰富的插件和主题&#xff0c;可以支持多语言内容。以下是搭建多语言国际站的步骤和建议&#xff1a; 安装WordPress&#xff1a;首先&#xff0c;您…

Unity 性能优化之遮挡剔除(Occlusion Culling)(六)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、遮挡剔除是什么&#xff1f;二、静态遮挡剔除的使用步骤1.标记为遮挡剔除对象2.创建Occlusion Area组件3.烘焙4.Occlusion窗口Bake的参数Smallest Oc…

后台启动HIVE的JDBC连接

后台启动HIVE的JDBC连接 生活就像一杯咖啡&#xff0c;有时苦涩&#xff0c;有时香甜&#xff0c;但都是值得品味的经历。无论遇到什么挑战&#xff0c;记住在每一天的开始&#xff0c;你都有机会给自己倒上一杯清新的力量&#xff0c;为心灵添一抹温暖。勇敢地面对生活的苦与甜…

(第11天)【leetcode题解】344、反转字符串 541、反转字符串II #替换数字

目录 344、反转字符串题目描述思路代码 反转字符串II题目描述思路代码 替换数字题目描述思路代码 344、反转字符串 题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必…

专家解读 | NIST网络安全框架(1):框架概览

随 着信息技术的快速发展&#xff0c;组织面临着越来越严峻的网络安全挑战。NIST网络安全框架&#xff08;NIST Cybersecurity Framework&#xff0c;CSF&#xff09;是一个灵活的综合性指南&#xff0c;旨在协助各类组织建立、改进和管理网络安全策略&#xff0c;以加强网络安…

【Node.js】高级 TypeScript:探索泛型、条件类型和索引访问类型

高级 TypeScript&#xff1a;探索泛型、条件类型和索引访问类型 作者&#xff1a;Alex Martinez 来源&#xff1a;https://lyricalstring.medium.com/advanced-typescript-exploring-generics-conditional-types-and-indexed-access-types-f606768f1250 文章目录 高级 TypeScri…

Java基础(19)Cookie和Session

在Web开发中&#xff0c;Cookie和Session是用来保持客户端和服务器之间状态的两种机制。它们有不同的工作方式及应用场景。 Cookie Cookie是服务器发送到用户浏览器并保存在本地的一小块数据&#xff0c;它会在浏览器下次向同一服务器再次发起请求时被发送回服务器。Cookie常…

计算机网络学习记录Day1

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 计算机网络学习记录Day1 本文基于1.1 计算机网络在信息…