新闻中心

C# 如何进行异步文件I/O操作 - ReadAsync和WriteAsync

2025-12-04
浏览次数:
返回列表
ReadAsync和WriteAsync需配合FileOptions.Asynchronous创建FileStream才能真正异步,否则退化为同步;推荐复用ArrayPool.Shared缓冲区,File类静态方法适合小文件但不适用于超大文件。

c# 如何进行异步文件i/o操作 - readasync和writeasync

在 C# 中,ReadAsyncWriteAsync 是进行高效、非阻塞文件 I/O 的核心方法,它们基于 Stream 类(如 FileStream)提供真正的异步支持,避免线程池资源浪费,特别适合处理大文件或高并发 I/O 场景。

使用 FileStream 配合 ReadAsync 读取文件

必须用 FileOptions.Asynchronous 创建 FileStream,否则 ReadAsync 会退化为同步调用(内部通过线程池模拟异步,失去性能优势)。

  • 打开文件时指定 FileOptions.Asynchronous
  • 推荐配合 Memory<byte></byte>ArrayPool<byte>.Shared</byte> 复用缓冲区,减少 GC 压力
  • 注意:ReadAsync 返回实际读取字节数,可能小于缓冲区长度(尤其是流末尾或网络文件)
示例:
using var fs = new FileStream("data.bin", FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true);
var buffer = new byte[8192];
int bytesRead = await fs.ReadAsync(buffer, CancellationToken.None);

使用 WriteAsync 写入文件的正确姿势

和读取一样,写入也依赖底层 FileStream 是否启用异步模式。未启用时,WriteAsync 同样会同步执行。

  • 创建 FileStream 时必须传入 useAsync: true(即 FileOptions.Asynchronous
  • 可直接写入 ReadOnlyMemory<byte></byte>,无需复制到数组
  • 若需确保数据落盘,调用 await fs.FlushAsync();但频繁刷盘影响性能,应按需使用
示例:
using var fs = new FileStream("output.txt", FileMode.Create, FileAccess.Write, FileShare.None, 4096, useAsync: true);
var data = Encoding.UTF8.GetBytes("Hello async world!");
await fs.WriteAsync(data, CancellationToken.None);
await fs.FlushAsync(); // 可选:强制写入磁盘

更简洁:File类的高级异步封装

.NET 提供了开箱即用的异步静态方法,内部已正确配置 FileStream,适合简单场景(如读写整个小文件)。

神笔马良 神笔马良

神笔马良 - AI让剧本一键成片。

神笔马良 320 查看详情 神笔马良
  • File.ReadAllTextAsync / File.WriteAllTextAsync:自动处理编码与流生命周期
  • File.ReadAllBytesAsync / File.WriteAllBytesAsync:适合二进制内容
  • ⚠️ 注意:这些方法会将整个文件加载到内存,不适用于超大文件(>100MB)
示例:
string content = await File.ReadAllTextAsync("config.json");
await File.WriteAllTextAsync("log.txt", "Done at " + DateTime.Now);

异常与取消处理不能少

异步 I/O 操作可能因磁盘满、权限不足、路径不存在等失败,且支持 CancellationToken 主动中断。

  • 始终用 try-catch 捕获 IOExceptionUnauthorizedAccessException 等常见异常
  • CancellationToken 传给所有 Async 方法,响应用户取消或超时
  • 注意:取消操作本身可能抛出 OperationCanceledException,需单独处理
建议结构:
try
{
    await fs.WriteAsync(buffer, cancellationToken);
}
catch (OperationCanceledException)
{
    // 用户主动取消
}
catch (IOException ex)
{
    // 文件系统错误
}

基本上就这些。关键点就两个:用对 FileStream 的构造参数,别忘了传 useAsync: true;再就是合理使用缓冲区和取消令牌。不复杂但容易忽略。

以上就是C# 如何进行异步文件I/O操作 - ReadAsync和WriteAsync的详细内容,更多请关注其它相关文章!


# 令牌  # 巢湖网站建设公司报价  # 搜索引擎seo开发搜索引擎seo  # 大庆seo优化技巧费用  # 韶关网站关键字优化  # 网站推广公司哪家口碑好  # 高栏港网站建设内容需求  # 武隆的网站推广怎么收费  # 安徽专业的网站推广服务  # 网站建设免费国外  # seo标题长度  # 可选  # 解决问题  # 不存在  # 中文网  # 相关文章  # c#  # 尤其是  # 大文件  # 复用  # 与非  # red  # .net  # file类  # stream  # ai  # access  # 字节  # 编码  # json  # js  # 异步文件i/o 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  不同用户不同价格! 索尼开启账户个性化定价测试  在Go Martini框架中高效服务动态生成图像的实践指南  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  Eclipse怎么运行工程_Eclipse工程运行配置说明  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案  Go Martini框架:动态服务解码后的图片内容  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  Steam官网入口直达 Steam注册及登录步骤  Log4j Console Appender性能瓶颈与高并发优化策略  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  深入理解与实现最大堆的Heapify过程:常见错误与修正  C++ vector二维数组定义_C++ vector of vector用法  C++ map遍历方法大全_C++ map迭代器使用总结  Archive of Our Own官网直达 AO3最新可用地址一览  铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  利用5118提升短视频内容效果_5118短视频关键词优化方法  windows10怎么关闭系统提示音_windows10彻底静音设置方法  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  抓大鹅无需下载版 抓大鹅秒玩版入口  如何将HTML表格多行数据保存到Google Sheet  魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  html5 app怎么运行环境_配html5 app运行环境【教程】  优化Log4j2控制台输出性能:解决异步日志瓶颈  微信网页版扫码登录入口 微信网页版二维码登录入口  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  蛙漫2台版漫画地址 Manwa2正版网页版链接  126邮箱网页版官方入口 126邮箱账号在线登录平台  TikTok网页版直接登录 TikTok网页端官方平台入口  如何使 Jest 模拟函数默认抛出错误以提高测试效率  12306选座如何查看座位示意图_12306座位示意图解读与使用  Win11截图该按哪些键 Win11截屏完整流程解析【教程】  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  Lar*el Form Request中唯一性验证在更新操作中的正确实现  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  C++指针和引用有什么区别_C++内存管理核心概念深度解析 

搜索