如何将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
相关产品推荐
相关产品推荐

