30. 异步和多线程 📅 发布时间:2026/7/12 7:18:51 👁️ 浏览次数: 1.异步和多线程简介2.IOCP3.await后代码执行的线程1.异步和多线程简介a.多线程:像是你同时请了多个工人(线程)干活,每个工人独立执行自己的任务,CPU需要在这些工人之间切换调度;这是并 发执行的一种实现方式 b.异步:是一种编程模式/思想,核心是非阻塞—— 当遇到耗时操作(比如:IO、网络请求)时,当前线程不会傻等,而是去 处理其他任务,等耗时操作完成后再回来处理结果;异步不一定需要创建新线程1).IO密集型 最典型的就是文件读写, 数据库操作, 网络请求等,这类操作的耗时主要花在等待外部设备(硬盘/网络)响应,而非占用 CPU;C#的异步在处理这类操作时,底层会利用操作系统的IOCP(IO完成端口)机制, 不会创建新线程usingSystem;usingSystem.IO;usingSystem.Threading.Tasks;classProgram{staticasyncTaskMain(){// 异步读取文件IO密集型stringcontentawaitReadFileAsync(test.txt);Console.WriteLine(content);}staticasyncTaskstringReadFileAsync(stringpath){// await执行时当前线程会返回线程池去处理其他任务// 文件读取完成后系统会通知CLR再从线程池取一个线程继续执行后续代码// 全程没有创建新线程只是复用了线程池的线程using(varreadernewStreamReader(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.IOCPIOCP就是操作系统为程序提供的一个异步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操作释放主线程stringcontentawaitReadFileAsync(test.txt);// 打印await后的线程信息此时是线程池线程Console.WriteLine($await后线程ID{Thread.CurrentThread.ManagedThreadId}是否线程池线程{Thread.CurrentThread.IsThreadPoolThread});Console.WriteLine(content);}staticasyncTaskstringReadFileAsync(stringpath){// 确保文件存在先创建一个测试文件if(!File.Exists(path))awaitFile.WriteAllTextAsync(path,测试IOCP异步读取);using(varreadernewStreamReader(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});// 异步读取文件stringcontentawaitFile.ReadAllTextAsync(test.txt);// 打印await后的线程信息还是原UI主线程MessageBox.Show($await后线程ID{Thread.CurrentThread.ManagedThreadId}是否线程池线程{Thread.CurrentThread.IsThreadPoolThread});// 直接更新UI控件无跨线程异常因为回到了UI线程label1.Textcontent;}}c.unity中await后代码会回到主线程usingUnityEngine;usingUnityEngine.UI;usingSystem.Threading.Tasks;publicclassAsyncLoadAwaitExample:MonoBehaviour{publicTexttipText;privateasyncvoidStart(){Debug.Log($Start方法线程ID{System.Threading.Thread.CurrentThread.ManagedThreadId});// 异步加载资源await后自动回主线程varresourceRequestResources.LoadAsyncSprite(Images/player);awaitresourceRequest;// 打印await后的线程ID和主线程一致Debug.Log($await后线程ID{System.Threading.Thread.CurrentThread.ManagedThreadId});// 直接操作UISpritesprite(Sprite)resourceRequest.asset;tipText.textAwait加载完成;}}
GD32F103C8T6每个引脚介绍和整理 以下是 GD32F103C8T6 微控制器(LQFP48 封装)的 完整引脚功能介绍与整理。该芯片由兆易创新(GigaDevice)推出,兼容 STM32F103C8T6,基于 ARM Cortex-M3 内核,主频最高 108MHz。 📌 基本信息 封装:LQFP48(48 引脚) GPIO 总数:37 个(分属 PA、PB、PC、PD 四组) 电源… 2026/7/11 19:09:18
java+vue基于springboot的和Vue的毕业设计选题管理系统的设计与实现_cu9atc26 目录 基于SpringBoot和Vue的毕业设计选题管理系统设计与实现系统功能模块技术栈亮点系统优势 开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 基于SpringBoot和Vue的毕业设计选题管理系统设计与实现 该系统采用前后端分离架构… 2026/5/17 2:43:23
2分钟,生成你的数字分身:华为云数字人解锁企业高效未来 在数字化浪潮席卷各行各业的今天,企业如何以更低成本、更高效率实现数字化转型?华为云数字人给出了一个令人惊叹的答案——依托盘古大模型赋能,仅需2分钟视频素材,即可生成高度仿真的数字分身,为企业生产力带来革新性突… 2026/7/11 4:55:37
Wireshark 4.0 分析蚁剑加密流量:5个关键特征与2种解密手法对比 Wireshark 4.0深度解析:蚁剑加密流量特征识别与解密实战指南1. 蚁剑流量分析的技术背景与核心挑战在当今数字化环境中,Web应用安全已成为企业防护体系的前沿阵地。作为一款开源的跨平台网站管理工具,蚁剑因其模块化设计和丰富的功能特性&… 2026/7/12 7:17:57
健身耳机什么品牌的好用?2026最适合健身用的运动耳机合集整理 不知道你们健身时有没有遇过这些闹心的小状况:硬拉刚发力到紧要处,耳机顺着汗滑到耳垂,只能咬着牙腾出手去扶;跳操蹦跶没几轮,入耳式闷得发潮,摘下来半天都缓不过劲;器械区本来就吵,… 2026/7/12 7:17:57
UE4网络同步实战:从NavMesh到RPC的完整配置与优化指南 1. 项目概述:为什么UE4网络同步是多人游戏开发的基石在UE4里做多人游戏,网络同步这块儿要是没整明白,那基本就等于在沙地上盖楼,看着热闹,一上线就塌。我见过太多项目,单机Demo跑得飞起,一到联机… 2026/7/12 7:15:57
ProcessOn 2024 实战:3步绘制专业时序图,清晰表达微服务交互逻辑 ProcessOn 2024 实战:3步绘制专业时序图,清晰表达微服务交互逻辑 时序图作为UML中最具动态表现力的工具之一,在微服务架构设计中扮演着关键角色。它不仅能清晰展示服务间的调用顺序,还能揭示潜在的性能瓶颈和设计缺陷。本文将带您… 2026/7/12 7:15:57
Hydra 9.5 多协议暴力破解对比:RDP/SSH/FTP 3种服务实战效率分析 Hydra 9.5 多协议暴力破解实战:RDP/SSH/FTP 效率对比与优化策略1. 多协议暴力破解的核心挑战在网络安全评估中,暴力破解作为验证系统弱口令的最后一道防线,其效率直接影响测试结果。Hydra 作为支持30协议的并行化登录破解工具,其9… 2026/7/12 7:13:56
Unity VR手势交互实战:基于WaveXR实现裸手射击游戏 1. 项目概述:当射击游戏遇见裸手交互最近在折腾HTC VIVE Focus 3一体机上的开发,手头正好有个之前用Unity做的传统射击游戏Demo,玩法就是用控制器瞄准、扣扳机射击。功能是完整的,但总觉得少了点什么。直到我深入研究了VIVE Wave … 2026/7/12 7:13:56
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14