从S3并行下载文件(AWS .NET SDK)

时间:2016-05-26 21:41:07

标签: amazon-s3 aws-sdk

我无法AmazonS3Client.GetObject并行下载文件。代码如下:

public async Task<string> ReadFile(string filename)
{
    string filePath = config.RootFolderPath + filename;
    var sw = Stopwatch.StartNew();
    Console.WriteLine(filePath + " - start");
    using (var response = await s3Client.GetObjectAsync(config.Bucket, filePath))
    {
        Console.WriteLine(filePath + " - request - " + sw.ElapsedMilliseconds);
        using (var reader = new StreamReader(response.ResponseStream))
        {
            return await reader.ReadToEndAsync();
        }
    }
}

这就是这样的:

var tasks = (from file in files select ReadFile(file)).ToArray();
await Task.WhenAll(tasks);

这导致请求按顺序返回(尽管不是按顺序)。我读了大约50个小文件,因此最后一次读取时方法GetObjectAsync大约需要25秒。相反,我希望我能在2-3秒内读取50个文件。

我已经验证过:

  1. 我在任务池上。因此同步上下文不在混合中。我还在任务中添加了ConfigureAwait(false),但这并没有像预期的那样有所作为。
  2. 我尝试使用AmazonS3Client进行各种设置,例如使用HTTP协议或更改缓冲区大小。没有成功。
  3. 我添加了一个秒表来验证问题是不是在阅读响应流。但是,当不读取响应流时,整个方法会快速返回。

0 个答案:

没有答案