讲师中心 微信公众号
AI工具推荐 视频效率加速

c# C#中的同步I/O和异步I/O在操作系统层面的区别

胖雪大大_7322

胖雪大大_7322

发布时间:2026-01-07 09:52:02

|

1066人浏览过

|

来源于php中文网

原创

同步I/O在Windows中通过阻塞当前线程实现,需FILE_FLAG_OVERLAPPED才能启用IOCP异步机制;FileStream默认不启用IOCP(.NET 5+已改),小文件同步读反而增加开销;async/await有效性取决于底层是否真异步。

c# c#中的同步i/o和异步i/o在操作系统层面的区别

同步I/O在Windows内核中如何阻塞线程

同步I/O调用(如 FileStream.Read() 或 File.ReadAllText())最终会通过Win32 API(如 ReadFile())进入内核。当文件句柄是同步打开的(即未指定 FILE_FLAG_OVERLAPPED),内核会直接在当前线程的内核栈上发起IRP(I/O Request Packet),并让该线程进入等待状态(WaitForSingleObject 类语义)。此时线程被挂起,不消耗CPU,但占用一个线程栈(默认1MB)和线程对象资源。

常见错误现象:在ASP.NET Core中大量使用 File.ReadAllBytes() 处理上传文件,导致线程池耗尽、请求排队、响应延迟陡增。

  • 同步I/O不等于“立刻返回”——它只是代码写起来像同步,实际在等磁盘或网络就绪
  • 即使数据已在系统缓存(如NTFS cache),同步读仍需经历用户态→内核态切换和IRP调度开销
  • 对网络套接字(Socket.Receive())同样适用:未设 SO_RCVTIMEO 时会无限期等待对方发包

异步I/O如何绕过线程阻塞(IOCP机制)

C#中 FileStream.ReadAsync() 或 Socket.ReceiveAsync() 底层依赖Windows的I/O Completion Port(IOCP)。关键在于:文件/套接字必须以 FILE_FLAG_OVERLAPPED 标志打开(.NET内部自动处理),且I/O请求通过 ReadFileEx() 或 WSARecv() 提交,不等待完成,立即返回。

完成通知不靠轮询或新线程,而是由内核在I/O结束后将完成包投递到绑定的IOCP句柄;.NET线程池中的某个线程(非发起线程)调用 GetQueuedCompletionStatus() 取出结果并调度回调(如 await 后续代码)。

Livestream Script Generator
Livestream Script Generator

直播带货脚本:话术、节奏、互动、促单。适用于主播、电商运营、MCN机构。

下载
  • IOCP线程数默认 ≈ CPU核心数,可高效复用少量线程处理成千上万并发I/O
  • 注意:不是所有设备都支持真正的异步I/O——例如某些USB存储设备或老旧驱动可能回退到模拟异步(用线程池线程同步执行再回调)
  • async/await 本身不保证底层是异步I/O,比如 MemoryStream.ReadAsync() 实际是同步内存拷贝+Task.CompletedTask

为什么 FileStream 默认不启用IOCP?

.NET的 FileStream 构造函数中,useAsync: true 参数决定是否启用内核级异步I/O。但默认值是 false(.NET 5+ 已改为 true,但旧项目或显式传 false 仍存在)。原因很实际:

  • 小文件读写(
  • 某些场景(如日志写入)需要严格顺序,而IOCP完成顺序不保证与提交顺序一致(需手动维护序列号)
  • 调试困难:异步堆栈无法直接追溯到原始调用点,异常堆栈常止于 ThreadPoolWorkQueue.Dispatch()

验证方式:用Process Explorer查看进程句柄,同步打开的文件句柄类型为 File,异步打开的会显示 File (Overlapped)。

容易被忽略的混合陷阱

最典型的反模式是「伪异步」:用 Task.Run(() => File.ReadAllBytes()) 包裹同步I/O。这没减少I/O等待,只是把阻塞从主线程移到了线程池线程,反而增加调度和上下文切换负担。

  • 数据库访问同理:SqlConnection.Open() 是同步的,OpenAsync() 才触发真正的异步登录流程(基于 WSAConnectEx)
  • ASP.NET Core中间件中混用同步和异步:一个 async 方法里调用 Request.Body.Read()(同步)会导致整个请求管道阻塞
  • 第三方库若未标记 [AsyncStateMachine] 或内部用 Thread.Sleep() 模拟延迟,await 不会释放线程

真正关键的分水岭不在C#语法,而在那个内核句柄是不是 OVERLAPPED——其余都是包装和调度策略。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

709

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

644

2025.12.18

ThinkPHP中间件机制与请求拦截处理实践
ThinkPHP中间件机制与请求拦截处理实践

本专题围绕 ThinkPHP 中间件体系展开,深入讲解中间件的定义、注册与执行流程。内容包括全局中间件与路由中间件的区别、请求前后处理逻辑、自定义中间件开发以及权限验证与日志处理应用。通过实际案例,帮助开发者掌握中间件在项目中的核心作用与最佳实践。

458

2026.03.31

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6687

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2768

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6687

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2768

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4678

2023.08.10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Conan 2 安装指南
Conan 2 安装指南

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn