Проблема: Я хотел бы загрузить 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 запросов параллельно, что хорошо. Однако есть две проблемы:
- Последний оператор будет загружать файлы поочередно, а не параллельно. В потоке не существует метода BeginCopyTo()/EndCopyTo()...
- Предыдущий оператор не отпустит, пока все запросы не ответят. Другими словами, ни один из файлов не начнет загружаться до тех пор, пока все они не начнутся.
Итак, я начинаю думать, что я иду по неправильному пути...
Справка