C# Azure blob DownloadToStream花费的时间太长
我试图从Azure blob下载一个文件,但在0.1%的情况下,它只是挂在blockBlob.DownloadToStream(…)上超过10分钟。有没有办法让这个功能在2分钟内超时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(
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。这是一种标准(但传统)异步编程模式,已被此处提到的异步/等待模式所取代: