news 2026/6/9 23:07:19

1.14 Async和Await

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
1.14 Async和Await

1.上下文

2.Async和Await简介

3.Await后续代码在哪个线程执行

4.Await 和同步上下文

5.Await究竟干了什么


1.上下文

想象一下:你在不同的场合,同样是"我饿了",意思完全不同 a.在家说"我饿了"->妈妈给你做饭 b.在朋友家说"我饿了"->朋友给你零食 同样一句"我饿了",因为说的时候环境不同,结果完全不同
编程中的上下文就是当前代码能有的所有东西(变量,方法,,资源,环境信息)的集合,就 像你在厨房,上下文就是厨房里的工具(,,食材),你能做饭
publicclassExample{privatestringname="全局名字";// 这是类的上下文(成员变量)publicvoidMethod1(){stringname="局部名字";// 这是方法的上下文(局部变量)Console.WriteLine(name);// 输出“局部名字”// 因为当前方法上下文中有name,就先用它}publicvoidMethod2(){Console.WriteLine(name);// 输出“全局名字”// 方法上下文没有name,就用类的上下文中的name}}

同步上下文在异步操作后,默认会回到原来的上下文
// UI程序中,控制回到UI线程执行privateasyncvoidButton_Click(objectsender,EventArgse){// 异步操作前:UI线程上下文awaitTask.Delay(1000);// 异步操作后:默认会回到原来的上下文(UI线程)label.Text="完成";// 安全访问UI控件}// 指定不捕获上下文(提高性能)awaitTask.Delay(1000).ConfigureAwait(false);// 这里不会回到UI线程上下文

2.Async和Await简介

asyncawait用来简化异步编程,让异步代码像同步代码一样,易于理解 a.async关键字用于修饰一个方法,表示该方法是异步的;异步方法的返回类型通常是Task,Task<T>b.异步方法内部,可以使用await关键字来等待一个异步操作(Task),而不会阻塞当前线程 c.使用await关键字的方法必须用async修饰
// 1. 声明异步方法:在方法前加 asyncpublicasyncTask<string>下载网页(){// 2. 使用 await 等待异步操作完成string内容=await网络下载方法();// 3. await 后面的代码会等待,但不会阻塞线程Console.WriteLine("下载完成");return内容;// 自动包装成 Task<string>}

3.Await后续代码在哪个线程执行

a.当初始的await被调用时,异步函数内部的代码仍在与调用线程相同的线程上运行 b.后续的await延续内容可能在不同的线程池中执行,取决于线程池

4.Await 和同步上下文

在C#异步编程中,await关键字用于挂起当前方法,直到等待的异步操作完成;当异步操作完成 后,方法会尝试恢复执行
同步上下文(SynchronizationContext)是一个抽象,它代表了一个线程的上下文环境;在 Windows Forms、WPF、ASP.NET等应用程序模型中,都有一个特定的同步上下文,它通常与 UI线程相关联,用于确保代码在正确的线程上执行(:UI控件的更新必须在UI线程上进行)
当我们使用await,默认情况下,await会捕获当前的同步上下文,并在该同步上下文中恢复 执行;这意味着,如果在UI线程上使用await,那么await之后的代码将会在UI线程上执行,这样我们就可以安全地更新UI控件
ConfigureAwait(false)来告诉await不需要捕获原始同步上下文,而是在线程池上下文中恢 复执行
privateasyncvoidbutton1_Click(objectsender,EventArgse){// 这里在UI线程上执行awaitSomeAsyncMethod();// 这里也会在UI线程上执行,所以可以安全更新UIlabel1.Text="Done";}

5.Await究竟干了什么

当我们使用asyncawait,c#编译器将异步方法转换成一个状态机;状态机将异步方法分成 了多个步骤,每一个await都是一个状态;当遇到await,如果等待的任务尚未完成,状态机 会将方法挂起(返回),并注册一个续延(continuation),当任务完成后,再调用续延来恢复 方法的执行(从上次暂停的地方继续)

1).原始代码
asyncTask 示例方法(){Console.WriteLine("开始");inta=10;stringresult=await网络请求();// 第一个awaita=a+5;Console.WriteLine($"结果:{result}, a={a}");awaitTask.Delay(1000);// 第二个awaitConsole.WriteLine("完成");}

2).编译器把它变成状态机
// 伪代码,展示状态机原理class状态机{int状态=0;// 0=刚开始,1=第一个await后,2=第二个await后inta;stringresult;void继续执行(){switch(状态){case0:// 第一次执行Console.WriteLine("开始");a=10;发起的网络请求=开始网络请求();状态=1;// 挂起,等网络请求完成break;case1:// 网络请求完成后继续result=获取网络请求结果();a=a+5;Console.WriteLine($"结果:{result}, a={a}");开始延迟();状态=2;// 挂起,等延迟完成break;case2:// 延迟完成后继续Console.WriteLine("完成");break;}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:53:05

【读点论文】Depth Anything V2数据范式革新+模型蒸馏优化+评估基准升级,好的合成数据优于标注不佳真实数据,依旧Dinov2+DPT解码器,优化改变了损失设计和数据增强

Depth Anything V2 Abstract 这项工作介绍了Depth Anything V2。在不追求花哨技术的情况下&#xff0c;我们的目标是揭示关键发现&#xff0c;为构建强大的单目深度估计模型铺平道路。值得注意的是&#xff0c;与V1 相比&#xff0c;该版本通过三个关键实践产生更精细&#x…

作者头像 李华
网站建设 2026/6/10 9:03:12

从ToDetect看浏览器指纹检测平台的优劣与选择技巧

随着网络安全和隐私保护意识的提升&#xff0c;越来越多的企业和个人开始关注浏览器指纹检测。浏览器指纹是一种无需Cookies就能识别用户身份的技术&#xff0c;通过浏览器的配置、插件、字体、屏幕分辨率等信息生成一个相对唯一的标识。 对于企业来说&#xff0c;准确的浏览器…

作者头像 李华
网站建设 2026/6/10 15:35:56

RLVE:通过自适应可验证环境扩展语言模型的强化学习

RLVE&#xff1a;通过自适应可验证环境扩展语言模型的强化学习一段话总结全文 这篇论文《RLVE: Scaling Up Reinforcement Learning for Language Models with Adaptive Verifiable Environments》提出了一种创新的RL框架&#xff0c;针对语言模型&#xff08;LM&#xff09;强…

作者头像 李华
网站建设 2026/6/10 15:37:02

断言那些事儿:单测只需要一个断言?

一个测试用例&#xff0c;而不是一个测试断言。 断言轮盘并不意味着多重断言就是坏事。当我指导团队或单个开发人员进行测试驱动开发&#xff08;TDD&#xff09;或单元测试时&#xff0c;经常会遇到一种特别的观念&#xff1a; 多个断言是不好的。一个测试必须只有一个断言。…

作者头像 李华
网站建设 2026/6/10 2:44:27

Harbor 镜像仓库核心技术详解(适配 K8S 1.33)

作为 10 年经验的运维专家&#xff0c;我全程用 “人话” 拆解 Harbor 的漏洞扫描、签名验证、冷热镜像管理 ——放弃 Helm&#xff0c;纯 Docker Compose 部署&#xff0c;适配 K8S 1.33&#xff0c;每个环节都给 “能直接复制的操作步骤 生产级案例”&#xff0c;不绕理论&a…

作者头像 李华
网站建设 2026/6/10 15:48:01

WPS VBA插件7.1完整安装与使用指南:解锁办公自动化新境界

WPS VBA插件7.1完整安装与使用指南&#xff1a;解锁办公自动化新境界 【免费下载链接】最新版VBA插件7.1支持WPS 本仓库提供最新版VBA插件7.1的下载资源&#xff0c;该插件专为WPS设计&#xff0c;能够帮助用户在WPS中高效使用VBA功能 项目地址: https://gitcode.com/open-so…

作者头像 李华