Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure blob DownloadToStream花费的时间太长_C#_Azure_Azure Storage Blobs - Fatal编程技术网

C# Azure blob DownloadToStream花费的时间太长

C# Azure blob DownloadToStream花费的时间太长,c#,azure,azure-storage-blobs,C#,Azure,Azure Storage Blobs,我试图从Azure blob下载一个文件,但在0.1%的情况下,它只是挂在blockBlob.DownloadToStream(…)上超过10分钟。有没有办法让这个功能在2分钟内超时 CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName); using (var memoryStream = new System.IO.MemoryStream()) { blockBlob.DownloadToStream(

我试图从Azure blob下载一个文件,但在0.1%的情况下,它只是挂在blockBlob.DownloadToStream(…)上超过10分钟。有没有办法让这个功能在2分钟内超时

CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
using (var memoryStream = new System.IO.MemoryStream())
{
   blockBlob.DownloadToStream(memoryStream, null, new BlobRequestOptions()
   {
        ServerTimeout = TimeSpan.FromSeconds(120)
   });
   string content = Encoding.UTF8.GetString(memoryStream.ToArray());
}

您可以为整个DownloadToStream操作配置超时。例如,您可以将时间设置为120秒(对于整个DownloadToStream操作),将时间设置为30秒(对于每个REST调用),并指定一个(或者,对于每个REST调用),以便在请求超时或失败时启用重试。这样,每个单独的REST调用在服务器端将被限制为30秒(如果遇到服务器超时问题,重试策略将生效),而整个DownloadToStream操作在客户端将被限制为2分钟

请参考下面的代码示例。注意:该对象只需要构造一次,然后您就可以将其用于下面所有与blob相关的操作

        var maxRetryCount = 3;
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
        var blobRequestOptions = new BlobRequestOptions
        {
            ServerTimeout = TimeSpan.FromSeconds(30),
            MaximumExecutionTime = TimeSpan.FromSeconds(120),
            RetryPolicy = new ExponentialRetry(TimeSpan.FromSeconds(3), maxRetryCount),
        };

        using (var memoryStream = new MemoryStream())
        {
            blockBlob.DownloadToStream(memoryStream, null, blobRequestOptions);
        }

谢谢!我还获得了以下代码,可以在超时后重试下载blob

 CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
 var cts = new CancellationTokenSource((int)TimeSpan.FromSeconds(30 * (retryCount + 1)).TotalMilliseconds);

 using (var memoryStream = new System.IO.MemoryStream())
 {
    Task task = blockBlob.DownloadToStreamAsync(memoryStream, cts.Token);
    await task.ConfigureAwait(false);

    if (!task.IsCanceled && !task.IsFaulted)
    {
        return Encoding.UTF8.GetString(memoryStream.ToArray());                            
    }
    else if (task.IsCanceled)
    {
        retryCount++;
        Console.WriteLine("Task cancelled happened for blob: {0}. Increasing timeout to: {1} sec", blobName, retryCount * 30);
    }
}

我仍然建议利用RetryPolicy的官方支持,因为您只需传入BlobRequestOptions,而无需为每个请求编写重试代码。我已在回答中添加了代码示例,请检查。利用Azure存储客户端库中的现有选项是最佳做法。如果我的回答确实能帮助你回答这个问题,请将其标记为已回答,谢谢!为了下载高吞吐量的blob,我建议您尝试Azure存储数据移动库:哦,好的,谢谢肇星,但是如何使用“AzureStorageData移动库”?您能否提供一些示例代码或属性,以将文件作为流下载,如“DownloadToStreamAsync”。所以我不知道如何实现这一点,因为我对Azure存储非常陌生。如果您准备好帮助,那么我将创建一个新查询。请参阅此处的代码示例:否,BeginDownloadToStream和EndDownloadToStream只是DownloadToStreamAsync的传统异步版本,它们必须与DownloadToStreamAsync同时使用,并共享相同的性能。您可以看到C#in的BeginXXX和EndXXX模式的更多细节:在上面的文章中,示例方法是BeginRead和EndRead。这是一种标准(但传统)异步编程模式,已被此处提到的异步/等待模式所取代: