C#异步编程之async与await

一:需求起因

在 C# 中使用异步编程(特别是使用 asyncawait 关键字)通常是为了提高应用程序的响应性和性能,特别是在需要进行 I/O 操作或执行长时间运行的任务时。

常见应用场景如下:

1. 网络请求

  • HTTP 请求:当应用程序需要从 Web API 获取数据时,异步请求可以避免阻塞主线程,确保用户界面在等待响应时仍然可用。使用 HttpClient 进行异步请求是一个常见的场景。

    public async Task<string> GetDataAsync(string url)
    {using (HttpClient client = new HttpClient()){return await client.GetStringAsync(url);}
    }
    

2. 文件 I/O 操作

  • 读取或写入文件:在处理大文件时,使用异步方法可以防止主线程被阻塞,从而保持应用程序的响应性。

public async Task<string> ReadFileAsync(string path)
{using (StreamReader reader = new StreamReader(path)){return await reader.ReadToEndAsync();}
}

3. 数据库操作

  • 数据库查询:在进行数据库查询时,尤其是涉及大量数据的查询,异步执行可以提高性能并减少对主线程的影响。例如,使用 Entity Framework 的异步方法。

public async Task<List<MyEntity>> GetEntitiesAsync()
{using (var context = new MyDbContext()){return await context.MyEntities.ToListAsync();}
}

4. 长时间运行的计算

  • CPU 密集型任务:虽然 I/O 密集型操作最适合异步,但在某些情况下,长时间运行的计算也可以使用异步。在这种情况下,通常会结合 Task.Run 来在后台线程上执行计算任务,以避免对 UI 线程的阻塞。

public async Task<int> ComputeAsync()
{return await Task.Run(() => {// 进行复杂计算return 42; // 示例返回值});
}

5. 用户界面应用程序

  • 保持 UI 响应:在 WPF、WinForms 或其他 UI 应用程序中,异步操作可以防止应用程序在执行长时间任务时“冻结”。这对提升用户体验非常重要,用户可以继续与界面交互。

6. 并发操作

  • 同时处理多个任务:使用异步编程可以轻松实现并发操作。例如,可以同时启动多个异步 I/O 操作并等待它们全部完成。

public async Task ProcessMultipleRequestsAsync(List<string> urls)
{var tasks = urls.Select(url => GetDataAsync(url));var results = await Task.WhenAll(tasks);// 处理返回的结果
}

二:机制与原理

  • async:这个关键字用于标记一个方法,表明这个方法里面会有异步操作。它告诉编译器,“这个方法可以在等待某些事情(比如网络请求、文件读写)完成时,不要阻塞整个程序。”

  • await:这个关键字用于等待一个异步操作完成。它会暂停当前方法的执行,但不会阻塞线程。也就是说,程序可以继续做其他事情,等到等待的事情完成后再回来继续执行剩下的代码。

方法变成状态机:

当你在方法前面加上 async 时,编译器会把这个方法转换成一种“状态机”。这意味着,方法的执行会被分成几个部分(状态),如下:

  • 开始执行:方法开始,执行到 await

  • 等待状态:当执行到 await 时,方法会暂停,控制权会回到调用者(线程控制权会回到async对应方法之后的位置继续执行,在await的位置留下了一个跳转节点和跳转触发标志)。此时,程序可以去做其他事情。

  • 继续执行:一旦异步操作完成,状态机会“恢复”执行,继续从 await 后的代码开始(await后面方法满足条件后操作完成后,跳转回来继续执行await后面的几行程序)。

任务的使用
  • 任务 (Task):await 通常后面跟的是一个 Task 对象。这个对象表示一个正在进行的操作(比如下载、读取文件等),并且可以在将来某个时候完成。

  • 调度:当 await 后面的操作完成时,程序会再次回到这个异步方法,继续执行后面的代码。

在 C# 中,asyncawait 是用于处理异步操作的关键字。它们使得程序可以在等待某些操作(如网络请求)完成时继续执行其他操作,从而提高应用的响应性。通过将方法转换为状态机,编译器能够在适当的时候恢复执行,并通过 Task 管理这些异步操作。这种方式让异步编程变得更加直观和易于使用。

三:注意事项

如果要使用async 异步方法(A)返回的结果(data:如网络读取的数据,或者io读取的文件)的时候,应该使得调用async 异步方法(A)的方法也是async ​​​​​​​关键字修饰的异步方法(B),然后在调用 (A) 的地方一定要使用 await,这样程序会在下载完成之后再继续执行,确保你可以获得正确的 data;即需要使用异步方法返回的结果的时候一定要放在同样是async修饰的方法中 await之后,以确保异步执行完获取到数据之后才执行数据处理。

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

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

相关文章

CSS 使用white-space属性换行

一、white-space属性的常见值 * 原本格式&#xff1a; 1、white-space:normal 默认值&#xff0c;空格和换行符会被忽略过滤掉&#xff1b;宽度不够时文本会自动换行 * 宽度足够时&#xff0c;normal 处理后的格式 * 宽度不够时&#xff0c; normal 处理后的格式 2、white-spa…

electron-builder打包时github包下载失败【解决办法】

各位朋友们&#xff0c;在使用electron开发时&#xff0c;选择了electron-builder作为编译打包工具时&#xff0c;是否经常遇到无法从github上下载依赖包问题&#xff0c;如下报错&#xff1a; Get "https://github.com/electron/electron/releases/download/v6.1.12/ele…

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 主机代理 配置

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 主机代理 配置 前言整体思路安装 WSL2Windows 环境升级为 WIN11 专业版启用window子系统及虚拟化 安装WSL2通过 Windows 命令提示符安装 WSL安装所需的 Linux 发行版&#xff08;如 Ubuntu 20.04&#xff09;查看…

2025学年安徽省职业院校技能大赛 “信息安全管理与评估”赛项 比赛样题任务书

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷&#xff08;五&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务1 &#xff1a;内存取证&…

数据库导出

MySQL数据库 使用命令行导出 导出整个数据库&#xff1a;在命令行中输入mysqldump -u用户名 -p密码 数据库名 > 导出文件路径/文件名.sql。例如mysqldump -uroot -p123456 mydb > /home/user/mydb_backup.sql&#xff0c;回车后输入密码即可将名为mydb的数据库导出为SQL…

OpenCV给图像添加噪声

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 如果你已经有了一张干净的图像&#xff0c;并希望通过编程方式向其添加噪声&#xff0c;可以使用 OpenCV 来实现这一点。以下是一个简单的例子&a…

OSPF BIT 类型说明

注&#xff1a;本文为 “OSPF BIT 类型 | LSA 类型 ” 相关文章合辑。 机翻&#xff0c;未校。 15 OSPF BIT Types Explained 15 种 OSPF BIT 类型说明 Rashmi Bhardwaj Distribution of routing information within a single autonomous system in larger networks is per…

Linux网络之传输层协议(UDP,TCP协议)

目录 重新认识端口号 端口号划分 netstat pidof UDP协议 UDP的特点 面向数据报 UDP的缓冲区 全双工和半双工 TCP协议 TCP的特点 TCP报头分析 源端口&#xff0c;目标端口&#xff0c;数据偏移(报文首部长度) 序号 确认号 窗口 6个标志位 ACK SYN …

Spring Boot 热部署

文章目录 一&#xff0c;Spring Boot热部署概述二&#xff0c;对项目HelloWorld01进行热部署 1、添加开发工具依赖2、热部署配置3、热部署测试 一&#xff0c;Spring Boot热部署概述 在开发过程中&#xff0c;通常会对一段业务代码不断地修改测试&#xff0c;在修改之后往往…

【前端基础】Day 3 CSS-2

目录 1. Emmet语法 1.1 快速生成HTML结构语法 1.2 快速生成CSS样式语法 2. CSS的复合选择器 2.1 后代选择器 2.2 子选择器 2.3 并集选择器 2.4 伪类选择器 2.4.1 链接伪类选择器 2.4.2 focus伪类选择器 2.5 复合选择器总结 3. CSS的元素显示模式 3.1 什么是元素显示…

使用vscode导出Markdown的PDF无法显示数学公式的问题

我的硬件环境是M2的MacBook air&#xff0c;在vscode中使用了Markdown PDF来导出md文件对应的PDF。但不管导出html还是PDF文件&#xff0c;数学公式都是显示的源代码。 我看了许多教程&#xff0c;给的是这个方法&#xff1a;在md文件对应的html文件中加上以下代码&#xff1a…

去耦电容的作用详解

在霍尔元件的实际应用过程中&#xff0c;经常会用到去耦电容。去耦电容是电路中装设在元件的电源端的电容&#xff0c;其作用详解如下&#xff1a; 一、基本概念 去耦电容&#xff0c;也称退耦电容&#xff0c;是把输出信号的干扰作为滤除对象。它通常安装在集成电路&#xf…

[原创]openwebui解决searxng通过接口请求不成功问题

openwebui 对接 searxng 时 无法查询到联网信息&#xff0c;使用bing搜索&#xff0c;每次返回json是正常的 神秘代码&#xff1a; http://172.30.254.200:8080/search?q北京市天气&formatjson&languagezh&time_range&safesearch0&languagezh&locale…

【JavaSE-1】初识Java

1、Java 是什么? Java 是一种优秀的程序设计语言,人类和计算机之间的交流可以借助 Java 这种语言来进行交流,就像人与人之间可以用中文、英语,日语等进行交流一样。 Java 和 JavaScript 两者有关系吗? 一点都没有关系!!! 前端内容:HTML CSS JS,称为网页三剑客 2、JDK 下…

C++知识整理day10——多态(多态的定义和实现、虚函数重写/覆盖、override和final关键字、纯虚函数和抽象类、多态的原理)

文章目录 1.多态的概念2.多态的定义和实现2.1 多态的构成条件2.2 多态必须具备的两个条件&#xff08;很重要&#xff09;2.3 虚函数2.4 虚函数的重写/覆盖2.5 协议&#xff08;了解即可&#xff09;2.6 析构函数的重写2.6 override和final关键字2.7 重载/重写/隐藏的对比 3.纯…

BladeX框架接口请求跨域

前端使用代理请求接口&#xff0c;接口可以正常访问。如果换全路径请求就跨域。 除了后端要配置跨域 还需要修改配置文件对OPTIONS请求的限制

文件操作 -- IO [Java EE 初阶]

目录 文件 1. 认识文件 2. 树型结构组织和目录 3. 文件路径 (Path) 4. 文件系统上存储的文件又可以分为两大类 4.1 文本文件 4.2 二进制文件 文件系统操作 1.Java 中操作文件 2. File 概述 2.1 属性 2.2 构造方法 2.3 方法 2.4 部分举例 文件内容操作 1. 数据流…

菜鸟之路Day19一一多线程(一)

菜鸟之路Day19一一多线程&#xff08;一&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.2.24 文章目录 菜鸟之路Day19一一多线程&#xff08;一&#xff09;o.概述1.什么是多线程2.并发与并行3.多线程的实现方式3.1继承Thread类的方式进行实现3.2实现Runnable接口的…

《Effective Objective-C》阅读笔记(上)

目录 高质量iOS之熟悉OC 了解OC语言的起源 在类的头文件中尽量少引入其他头文件 多用字面语法&#xff0c;少用与之等价的方法 字面数值 字面量数组 字面量字典 局限性 多用类型常量&#xff0c;少用#define预处理指令 用枚举表示状态、选项、状态码 高质量iOS之对象…

mysql --- 相关基础知识整理

目录 一、基本数据结构1、聚簇索引和非聚簇索引1.1 数据存储方式1.2 查询效率1.3 插入和更新性能1.4 适用场景 2、InnoDB 存储引擎2.1 B树2.2 行格式2.3 缓冲池2.4 日志文件 3、MyISAM存储引擎3.1 表文件结构3.2 B树3.3 数据存储特点 4、InnoDB和MyISAM的区别 二、索引1、索引类…