news 2026/6/10 15:58:03

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/6/10 2:15:37

智慧校园顶层设计实施计划:分阶段推进,稳步落地

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

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

“ModelEngine”这一名称目前**并非一个广为人知、标准化或广泛商用的公开AI/ML基础设施产品名称**

“ModelEngine”这一名称目前并非一个广为人知、标准化或广泛商用的公开AI/ML基础设施产品名称&#xff0c;而更可能属于以下几类情形之一&#xff1a; ✅ 企业内部代号或中台组件名&#xff1a;如阿里“PAI-Studio”下的模型服务模块、腾讯“TI-ONE”中的推理调度子系统、华为…

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

百考通AI:论文降重与去AI痕迹的智能解决方案,让毕业无忧!

毕业季的学术战场&#xff0c;论文查重与AI检测已成为学子们必须跨越的“双重关卡”。重复率超标、AI生成痕迹明显&#xff0c;不仅让辛苦撰写的论文面临返工风险&#xff0c;更可能影响毕业进程。面对这一困境&#xff0c;百考通AI&#xff08;https://www.baikaotongai.com&a…

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

道德约束测试:伦理规则引擎在自动驾驶决策链的验证框架

伦理测试的紧迫性与专业价值 随着自动驾驶技术向L3级以上演进&#xff0c;系统需承担动态驾驶主体责任&#xff0c;伦理决策成为安全核心。软件测试从业者面临全新挑战&#xff1a;如何验证算法在道德困境&#xff08;如“电车难题”&#xff09;中的决策合理性&#xff1f;伦…

作者头像 李华