c# - 异步写入和读取流

标签 c# stream

我想异步写入和读取流。我正在使用 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/

相关文章:

c# - 使用 MVC 上传文件而不是使用 C# 的第三方 API 时,如何在 Azure 应用服务中扫描病毒?

c# - 在 WPF 中的行的开头和结尾放置一个形状

c# - 如何使用 C# 为我的 WinRT 应用程序生成 MD5 哈希码?

c# - 如何使用 C# 上传文件并将其保存到流中以供进一步预览?

list - Haskell:列表与流

java - 根据流中的另一个字段汇总字段

c# - PCL - 对于某些目标,无法从 Func<IThing<T>> 转换为 Func<Object>

c# - 使用 iTextSharp 裁剪 PDF

c# - Webbrowser.DocumentStream 或 Webbrowser.DocumentText 不工作?

c# - 处置后调用 MemoryStream.ToArray() 是否危险?