【发布时间】:2021-08-11 15:23:49
【问题描述】:
我想异步写入和读取流。我正在使用 GCP 的存储 API,特别是 StorageClient.DownloadObjectAsync。它需要一个被写入的流。我想将写入该流的字节传递给我正在调用的另一个 API。
我正在苦苦挣扎的是阅读,因为它似乎流(MemoryStream 在这种情况下)不支持同时阅读和写作。还有其他选择吗?
这里是相关的sn-ps:
下载器
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% 的字节,即使文件已完全在内存中(虽然此文件可以放入内存,但并非所有文件都将能够)。
【问题讨论】:
-
这段代码是如何运行的?你怎么知道流不支持同时读写,会发生什么?您提供的细节越多,我们就越容易发现哪里出了问题
-
计划是两个有两个线程,一个用于写作,一个用于阅读。当我在文件下载时尝试读取时,即使文件完全在内存中,在 BinaryReader 停止读取之前我也只能获得 1% 的字节(虽然此文件可以放入内存,但并非所有文件都可以) .