Я вызываю указанный ниже метод для получения файлов из S3
.У меня есть список путей к файлам в коллекции.Я вызываю приведенный ниже метод внутри Parallel.Foreach
цикла.Метод addRecords()
для контейнера является потокобезопасным и гарантирует, что только один поток попадает в критическую секцию.Код пропускает некоторые файлы, и возвращаемый результат содержит меньше записей, чем ожидалось.
Parallel.ForEach(fileListAll, new ParallelOptions { MaxDegreeOfParallelism = 20 }, (currentFile) =>
{
string RecordsRaw = _AmazonS3.GetFileFromS3(currentFile);
Container.AddRecords(RecordsRaw);
});
public string GetFileFromS3(string filePath)
{
try
{
string ResponseData = null;
GetObjectRequest Request = new GetObjectRequest
{
BucketName = _AWSConfiguration.S3BucketName,
Key = filePath
};
using (GetObjectResponse response = _AmazonS3Client.GetObject(Request))
using (Stream responseStream = response.ResponseStream)
using (StreamReader reader = new StreamReader(responseStream))
{
ResponseData = reader.ReadToEnd();
}
if (!string.IsNullOrEmpty(ResponseData))
{
return ResponseData;
}
}
catch (Exception ex)
{
//Removed the code for brevity
}
return null;
}
Я не уверен, как изменить метод GetFileFromS3()
, чтобы он мог вызываться несколькими потоками при сохранениипараллелизм.
Пожалуйста, имейте в виду, поскольку это может быть основным вопросом, но я изо всех сил пытаюсь заставить его работать правильно.