Параллельная пакетная загрузка файлов с Amazon S3 с использованием AWS S3 SDK для.NET

Проблема:Я хотел бы загрузить 100 файлов параллельно с AWS S3, используя их.NET SDK. Скачанный контент должен храниться в 100 потоках памяти (файлы достаточно маленькие, и я могу взять его оттуда ). Я путаюсь между Task, IAsyncResult, Parallel. *и другие различные подходы в.NET 4.0.

Если я попытаюсь решить проблему самостоятельно , то навскидку представлю что-то вроде этого псевдокода: (отредактированного для добавления типов к некоторым переменным)

using Amazon;
using Amazon.S3;
using Amazon.S3.Model;

AmazonS3 _s3 =...;
IEnumerable<GetObjectRequest> requestObjects =...;


// Prepare to launch requests
var asyncRequests = from rq in requestObjects 
    select _s3.BeginGetObject(rq,null,null);

// Launch requests
var asyncRequestsLaunched = asyncRequests.ToList();

// Prepare to finish requests
var responses = from rq in asyncRequestsLaunched 
    select _s3.EndGetRequest(rq);

// Finish requests
var actualResponses = responses.ToList();

// Fetch data
var data = actualResponses.Select(rp => {
    var ms = new MemoryStream(); 
    rp.ResponseStream.CopyTo(ms); 
    return ms;
});

Этот код запускает 100 запросов параллельно, т.е. хорошо. Однако есть две проблемы:

  1. Последнее утверждение будет загружать файлы последовательно, а не параллельно. Кажется, в потоке нет метода BeginCopyTo ()/EndCopyTo ()...
  2. Предыдущий оператор не отпустит, пока не будут получены ответы на все запросы. Другими словами, ни один из файлов не начнет скачиваться, пока не начнутся все.

И тут я начинаю думать, что иду по ложному пути...

Помочь?

13
задан DenNukem 7 May 2012 в 20:56
поделиться