C# 从Azure Blob存储读取数据时,OpenReadAsync()会产生奇怪的结果

C# 从Azure Blob存储读取数据时,OpenReadAsync()会产生奇怪的结果,c#,azure,azure-storage-blobs,C#,Azure,Azure Storage Blobs,我正在尝试修改现有的C#(dot net core)应用程序,该应用程序读取一种二进制文件以使用Azure Blob存储 我正在使用Windows.Azure.Storage(8.6.0) 问题在于,该应用程序以非常小的块(例如5000-6000字节)从流中读取文件中的二进制数据。这反映了数据的结构 伪代码示例: var blocks = new List<byte[]>(); var numberOfBytesToRead = 6240; var numberOfBlocksTo

我正在尝试修改现有的C#(dot net core)应用程序,该应用程序读取一种二进制文件以使用Azure Blob存储

我正在使用Windows.Azure.Storage(8.6.0)

问题在于,该应用程序以非常小的块(例如5000-6000字节)从流中读取文件中的二进制数据。这反映了数据的结构

伪代码示例:

var blocks = new List<byte[]>(); 
var numberOfBytesToRead = 6240;
var numberOfBlocksToRead = 1700;

using (var stream = await blob.OpenReadAsync())
{
  stream.Seek(3000, SeekOrigin.Begin); // start reading at a particular position
  for (int i = 1; i <= numberOfBlocksToRead; i++)
  {
    byte[] traceValues = new byte[numberOfBytesToRead];
    stream.Read(traceValues, 0, numberOfBytesToRead);
    blocks.Add(traceValues);
  }
}`
var blocks=newlist();
var numberOfBytesToRead=6240;
var numberOfBlocksToRead=1700;
使用(var stream=await blob.OpenReadAsync())
{
stream.Seek(3000,SeekOrigin.Begin);//在特定位置开始读取

对于(int i=1;i是否无效/垃圾值为零?如果是(甚至可能不是)检查stream.Read的返回值。该方法不能保证实际读取您要求它读取的字节数。它可以读取更少的字节数。在这种情况下,您应该在循环中再次调用它,直到它读取了您想要的总量。快速web搜索应该会向您展示大量必要循环的示例。

为什么如果您仍在调用t.Result,请使用OpenReadAsync版本?这是一个好问题。正如在文章中提到的,我使用的是.net core和仅包含异步调用的Windows.Azure.Storage库。我猜代码只是从我正在做的一个测试中得到的,我决定同步调用它。我已经用wait更新了代码示例,但要明确的是,我已经更新了我仍然遇到同样的问题。您是否也尝试过DownloadToStreamAsync blob方法,它是OpenReadAsync的替代方法?如果您没有在StreamMinimumReadSizeInBytes属性中指定其他值,则4Mb是blob下载的默认块大小。是的,我尝试过DownloadToStreamAsync方法,效果很好。唯一的问题是我可能需要处理一些非常大的文件,在这种情况下,将整个文件下载到流中可能不是最好的解决方案。使用
DownloadToStreamAsync
时,可以传递文件流而不是内存流。或者,如果您想提高性能,可以使用
DownloadToFileAsync
下载大文件时,您可以利用
DownloadRangeToStream
并并行下载blob范围,您可以遵循详细的代码片段。这就是问题所在。现有应用程序正在从流中读取,但没有检查读取的字节数是否正确。对于FileStream,问题从未出现,但在正常工作时通过使用Azure Blob和OpenReadAsync()可以很快看出,您需要检查stream.Read返回的值。