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

C#处理高并发文件写入 C#如何设计一个高吞吐量的文件写入队列

梦枫吖_5511

梦枫吖_5511

发布时间:2026-02-28 08:40:03

|

592人浏览过

|

来源于php中文网

原创

高并发下 FileStream.Write 崩溃主因是内核句柄竞争、I/O 阻塞与磁盘寻道放大;StreamWriter 非线程安全易致异常或数据错乱;推荐 ConcurrentQueue + 后台线程批量刷盘解耦生产消费,兼顾性能与稳定性。

c#处理高并发文件写入 c#如何设计一个高吞吐量的文件写入队列

为什么直接 FileStream.Write 在高并发下会崩

多个线程同时调用 FileStream.Write 写同一个文件,哪怕加了 lock,也会因频繁的 I/O 阻塞、内核句柄竞争和磁盘寻道放大延迟,吞吐迅速跌穿 1MB/s。更糟的是,StreamWriter 默认带缓冲但非线程安全,跨线程写入可能触发 ObjectDisposedException 或数据错乱。

  • Windows 上对同一文件的并发 WriteFile 调用会被串行化,本质仍是单点瓶颈
  • 每次写入都触发一次系统调用,上下文切换成本在万级 QPS 下不可忽略
  • 小块写入(如每条日志几十字节)会激增磁盘 I/O 次数,SSD 寿命和延迟双受损

用 ConcurrentQueue + 后台写入线程是最稳的起点

核心思路是解耦“生产”和“消费”:业务线程只往线程安全队列投递数据,由单一后台线程批量刷盘。这避免锁争用,也天然聚合小写请求。

  • 用 ConcurrentQueue<string></string> 或 ConcurrentQueue<byte></byte> 存原始数据,比 BlockingCollection 更轻量(后者含额外同步开销)
  • 后台线程用 Thread.Sleep(1) 或 SpinWait.SpinOnce() 等待,别用 BlockingCollection.Take() —— 它在空时仍会进内核态,增加延迟
  • 攒够阈值(如 8KB 或 100 条)再刷盘,或每 10ms 强制 flush 一次,防消息积压过久
var queue = new ConcurrentQueue<byte[]>();
Task.Run(() => {
    var buffer = new List<byte[]>(128);
    while (!cancellationToken.IsCancellationRequested) {
        if (queue.TryDequeue(out var item)) {
            buffer.Add(item);
            if (buffer.Sum(b => b.Length) >= 8192) Flush(buffer);
        } else if (buffer.Count > 0) {
            Flush(buffer);
        } else {
            Thread.Sleep(1); // 低频轮询,避免 CPU 空转
        }
    }
});

MemoryMappedFile 适合超大吞吐但代价高

当单机写入持续超过 500MB/s(如金融行情快照),纯队列模型可能因内存拷贝和 GC 压力成为瓶颈。MemoryMappedFile 可绕过 .NET 堆,让多线程直接写共享内存页,再由独立线程调用 FlushViewOfFile 刷盘。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
  • 必须用 FileOptions.RandomAccess | FileOptions.WriteThrough 创建映射,禁用系统缓存,避免 double-buffering
  • 需自行管理写位置指针(long 类型原子变量),并处理跨页边界——写到页尾要手动切到下一页
  • 崩溃恢复难:映射文件不保证落盘顺序,断电可能丢最后几页数据,必须配 CRC 校验和 checkpoint 机制

别忽略 FileOptions.Asynchronous 和 WriteAsync

如果写入目标是网络文件系统(如 SMB 共享)或云存储网关,同步 I/O 会卡死整个线程池。此时应改用异步流,但要注意陷阱:

  • FileStream 必须用 FileOptions.Asynchronous 构造,否则 WriteAsync 内部仍走同步路径
  • 不要在 async void 方法里写日志,异常会静默丢失;统一用 async Task 并 await
  • 并发 WriteAsync 到同一文件仍需锁(如 SemaphoreSlim),但锁粒度可缩小到单次 write 调用,而非整条消息

真正难的不是堆砌技术,而是确定你的瓶颈在哪——是磁盘吞吐?CPU 序列化?还是网络延迟?先用 PerfView 抓一下 ThreadPool 和 IO 的热区,再决定上 MemoryMappedFile 还是老实用队列。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

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

WorkBuddy

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

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Loomy
Loomy Hot

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

相关专题

更多
c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3628

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

684

2025.10.23

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

351

2025.11.27

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

339

2026.04.23

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

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

5247

2023.07.18

堆和栈区别
堆和栈区别

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

2308

2023.08.10

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

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

3878

2023.08.10

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

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

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