You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将PipeReader读取的ReadOnlySequence写入Stream?

将PipeReader的ReadOnlySequence数据写入Stream的实现方法

因为Stream的WriteAsync没有直接接受ReadOnlySequence<byte>的重载,所以需要遍历ReadOnlySequence的每一段内存片段来完成写入。下面是修改后的完整可运行代码:

// 用using自动管理Stream资源,避免手动关闭遗漏
using Stream blobStream = await blobClient.OpenWriteAsync(false); 

while (true)
{
    var readResult = await reader.ReadAsync();
    ReadOnlySequence<byte> buffer = readResult.Buffer;

    // 遍历ReadOnlySequence的每个内存片段,逐个写入Stream
    foreach (ReadOnlyMemory<byte> segment in buffer)
    {
        await blobStream.WriteAsync(segment);
    }

    // 必须调用AdvanceTo告知PipeReader已处理完当前数据,防止内存泄漏
    reader.AdvanceTo(buffer.End);

    // 当PipeReader没有更多数据时,退出循环
    if (readResult.IsCompleted)
    {
        break;
    }
}

// 确保所有缓存数据都写入目标Stream
await blobStream.FlushAsync();

关键注意点

  • 遍历片段:ReadOnlySequence可能由多个不连续的内存块组成,必须逐个处理每个ReadOnlyMemory<byte>片段
  • 释放PipeReader资源:调用AdvanceTo是必须的,否则PipeReader会一直持有已处理的数据,导致内存泄漏
  • 处理完成状态:通过readResult.IsCompleted判断是否已经读取完所有数据,避免无限循环
  • 资源管理:用using语句管理Stream,确保资源自动释放

内容的提问来源于stack exchange,提问作者me.at.coding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:17:19