news 2026/5/1 8:36:48

30. 异步和多线程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
30. 异步和多线程

1.异步和多线程简介

2.IOCP

3.await后代码执行的线程


1.异步和多线程简介

a.多线程:像是你同时请了多个工人(线程)干活,每个工人独立执行自己的任务,CPU需要在这些工人之间切换调度;这是并 发执行的一种实现方式 b.异步:是一种编程模式/思想,核心是"非阻塞"—— 当遇到耗时操作(比如:IO、网络请求),当前线程不会傻等,而是去 处理其他任务,等耗时操作完成后再回来处理结果;异步不一定需要创建新线程

1).IO密集型 最典型的就是"文件读写, 数据库操作, 网络请求",这类操作的耗时主要花在等待外部设备(硬盘/网络)响应,而非占用 CPU;C#的异步在处理这类操作时,底层会利用"操作系统的IOCP(IO完成端口)机制, 不会创建新线程"
usingSystem;usingSystem.IO;usingSystem.Threading.Tasks;classProgram{staticasyncTaskMain(){// 异步读取文件(IO密集型)stringcontent=awaitReadFileAsync("test.txt");Console.WriteLine(content);}staticasyncTask<string>ReadFileAsync(stringpath){// await执行时,当前线程会返回线程池,去处理其他任务// 文件读取完成后,系统会通知CLR,再从线程池取一个线程继续执行后续代码// 全程没有创建新线程,只是复用了线程池的线程using(varreader=newStreamReader(path)){returnawaitreader.ReadToEndAsync();}}}

2).CPU密集型 如果异步方法里执行的是CPU密集型任务(比如复杂计算),此时异步需要依赖多线程才能实现非阻塞
usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;classProgram{staticvoidMain(){// new Thread:新建操作系统线程(不在线程池)newThread(()=>{// 打印线程ID+是否线程池线程(结果:否)Console.WriteLine($"new Thread线程ID:{Thread.CurrentThread.ManagedThreadId},是否线程池:{Thread.CurrentThread.IsThreadPoolThread}");}).Start();Console.ReadKey();}}

2.IOCP

IOCP就是操作系统为程序提供的一个"异步I/O结果通知中心",程序把I/O请求交给操作系统后就可以去干别的事,等I/O操作 完成了,操作系统会通过这个"通知中心"告诉程序"你的请求做完了, 来拿结果吧"
当你在C#中写awaitreader.ReadToEndAsync(),底层流程是这样的 a.你的C#程序调用.NET 类库的异步方法,.NET会把"读取文件"这个IO请求交给Windows操作系统 b.操作系统把这个请求加入IOCP的"待处理队列",然后立刻告诉你的C#程序"请求已提交",你可以先回去干活了 c.当硬盘完成文件读取后,操作系统会把"读取完成"的结果放到IOCP的"完成队列"里 d.".NET的CLR"会监控这个IOCP完成队列,发现有完成的请求后,从线程池取一个空闲线程,继续执行await后面的代码,比 如打印文件内容 整个过程中,没有为这个IO请求创建新线程,只有IO完成后才短暂占用一个线程处理结果,这就是异步IO比多线程处理IO高 效的根本原因,而IOCP就是实现这个流程的核心机制

3.await后代码执行的线程

await后代码的执行线程,不是绝对由线程池决定,而是由await执行前当前线程的"同步上下文"决定 a.控制台:无特殊同步上下文,"await后代码在线程池线程执行"
usingSystem;usingSystem.IO;usingSystem.Threading;usingSystem.Threading.Tasks;classProgram{staticasyncTaskMain(){// 打印主线程信息(控制台主线程不是线程池线程)Console.WriteLine($"主线程ID:{Thread.CurrentThread.ManagedThreadId},是否线程池线程:{Thread.CurrentThread.IsThreadPoolThread}");// 异步读取文件(IO操作,释放主线程)stringcontent=awaitReadFileAsync("test.txt");// 打印await后的线程信息(此时是线程池线程)Console.WriteLine($"await后线程ID:{Thread.CurrentThread.ManagedThreadId},是否线程池线程:{Thread.CurrentThread.IsThreadPoolThread}");Console.WriteLine(content);}staticasyncTask<string>ReadFileAsync(stringpath){// 确保文件存在(先创建一个测试文件)if(!File.Exists(path))awaitFile.WriteAllTextAsync(path,"测试IOCP异步读取");using(varreader=newStreamReader(path)){returnawaitreader.ReadToEndAsync();// IOCP处理的核心异步点}}}

b.UI程序:WinForm/WPF,"有UI同步上下文, await后代码会回到原UI主线程"
// 新建WinForm项目,在Form1中添加一个按钮Button1usingSystem;usingSystem.IO;usingSystem.Threading;usingSystem.Windows.Forms;publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privateasyncvoidButton1_Click(objectsender,EventArgse){// 打印UI主线程信息(非线程池线程)MessageBox.Show($"点击按钮的线程ID:{Thread.CurrentThread.ManagedThreadId},是否线程池线程:{Thread.CurrentThread.IsThreadPoolThread}");// 异步读取文件stringcontent=awaitFile.ReadAllTextAsync("test.txt");// 打印await后的线程信息(还是原UI主线程)MessageBox.Show($"await后线程ID:{Thread.CurrentThread.ManagedThreadId},是否线程池线程:{Thread.CurrentThread.IsThreadPoolThread}");// 直接更新UI控件(无跨线程异常,因为回到了UI线程)label1.Text=content;}}

c."unity中await后代码会回到主线程"
usingUnityEngine;usingUnityEngine.UI;usingSystem.Threading.Tasks;publicclassAsyncLoadAwaitExample:MonoBehaviour{publicTexttipText;privateasyncvoidStart(){Debug.Log($"Start方法线程ID:{System.Threading.Thread.CurrentThread.ManagedThreadId}");// 异步加载资源,await后自动回主线程varresourceRequest=Resources.LoadAsync<Sprite>("Images/player");awaitresourceRequest;// 打印await后的线程ID(和主线程一致)Debug.Log($"await后线程ID:{System.Threading.Thread.CurrentThread.ManagedThreadId}");// 直接操作UISpritesprite=(Sprite)resourceRequest.asset;tipText.text="Await加载完成";}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:38:35

java+vue基于springboot的汽车路试数据管理系统设计与实现_9859us78

目录系统概述技术架构核心功能模块创新点应用价值开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 该系统基于SpringBoot后端框架与Vue前端框架开发&#xff0c;旨在实现汽车路试数据的数字化管理。系统整合了车辆传感…

作者头像 李华
网站建设 2026/3/28 9:42:33

2分钟,生成你的数字分身:华为云数字人解锁企业高效未来

在数字化浪潮席卷各行各业的今天&#xff0c;企业如何以更低成本、更高效率实现数字化转型&#xff1f;华为云数字人给出了一个令人惊叹的答案——依托盘古大模型赋能&#xff0c;仅需2分钟视频素材&#xff0c;即可生成高度仿真的数字分身&#xff0c;为企业生产力带来革新性突…

作者头像 李华
网站建设 2026/5/1 6:04:44

利用Simulink验证Dual Extended Kalman Filter(DEKF)

【主题】利用Simulink对Dual Extended Kalman Filter&#xff08;DEKF&#xff09;进行验证。 【方式】主卡尔曼滤波器用来估计锂电池的SOC和端电压&#xff0c;辅助卡尔曼滤波器用来估计锂电池的内阻R0。 【电路模型】锂电池采用二阶等效电路模型。 【效果】SOC最大误差为1.07…

作者头像 李华
网站建设 2026/5/1 6:15:50

HoRain云--通过Xshell连接linux——安装tomcat

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/5/1 6:12:47

百考通AI:智能文献综述神器,让学术研究事半功倍!

在学术研究的征途中&#xff0c;文献综述往往是令无数学子"望而生畏"的关键环节。从海量资料中筛选核心文献、梳理研究脉络、规范引用格式&#xff0c;再到确保内容原创性&#xff0c;每一个步骤都耗费大量时间与精力。面对繁重的文献工作&#xff0c;许多学生不得不…

作者头像 李华
网站建设 2026/5/1 7:09:05

传统成果转化困局如何破?生态协同机制助力学术产业双赢

在当今科技飞速发展的时代&#xff0c;高校科研成果的转化已成为推动经济社会发展的重要驱动力。然而&#xff0c;在这一过程中&#xff0c;传统成果转化模式所面临的诸多困局却严重制约了科技成果的有效落地。本文将从传统转化困局出发&#xff0c;探讨生态协同机制如何破解这…

作者头像 李华