我想异步写入和读取流。我正在使用 GCP 的存储 API,特别是 StorageClient.DownloadObjectAsync
。它需要一个被写入的流。我想将写入该流的字节传递给我在写入时调用的另一个 API。
我正在努力解决的是读取问题,因为流(在本例中为MemoryStream
)似乎不支持同时读取和写入。还有其他选择吗?
以下是相关片段:
下载器
using (StorageClient sc = StorageClient.Create(cred))
{
await sc.DownloadObjectAsync(
"841f1487-d1b3-434d-8848-8a4bb0749b20",
@"filename",
stream);
}
作者
// Use a BinaryReader?
using BinaryReader br = new BinaryReader(stream);
int current = 0;
int total = 0;
do
{
current = br.Read(buffer, 0, buffer.Length);
if (current > 0)
{
fileStore.WriteFile(out int numberOfBytesWritten, directoryHandle, total, buffer);
total += current;
}
} while (current > 0)
编辑 - 添加附加信息
当我在下载文件时尝试读取时,即使文件完全位于内存中,在 BinaryReader 停止读取之前我也只能获取 1% 的字节(虽然该文件可以装入内存,但并非所有文件都会被读取)能够)。
最佳答案
终于找到我想要的了。答案是使用 Pipe
类。
这就像创建一个新管道 (Pipe pipeline = new Pipe()
) 一样简单,修改下载器以采用 PipeWriter
而不仅仅是一个流,以便当我完成编写时,我可以调用 pw.CompleteAsync()
(您仍然可以使用 pw.AsStream()
获取流),并传入 PipeReader
流与 pipe.Reader.AsStream()
。
关于c# - 异步写入和读取流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68744828/