我正在尝试从 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 操作配置超时。例如,您可以将 MaximumExecutionTime 设置为 120 秒(这是针对整个 DownloadToStream 操作),将 ServerTimeout 设置为 30 秒(这是针对每个 REST 调用),并指定一个 RetryPolicy( ExponentialRetryLinearRetry ,这是针对每个 REST 调用)以启用在请求超时或失败时重试。通过这样做,每个单独的 Get Blob REST 调用在服务器端将被限制为 30 秒(如果遇到服务器超时问题,重试策略将生效),并且整个 DownloadToStream 操作将在客户端被限制为 2 分钟。

请引用下面的代码示例。注意:BlobRequestOptions 对象只需要构造一次,然后就可以将其用于下面所有与 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);
        }

关于c# - Azure blob DownloadToStream 耗时太长,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30203070/

10-10 19:34