Currently I have this code:
private async Task<(List<SomeModel> data1, List<string> data2)>
ProcessFileAsync(IEnumerable<FileInfo> filesInDirectory)
{
var data1 = new List<SomeModel>();
var data2 = new List<string>();
var inDirectory = filesInDirectory as FileInfo[] ?? filesInDirectory.ToArray();
for (var lIndex = 0; lIndex < inDirectory.Count(); lIndex++)
{
var content = await File.ReadAllTextAsync(inDirectory.ElementAt(lIndex).FullName);
var name = Path.GetFileNameWithoutExtension(inDirectory.ElementAt(lIndex).Name);
var data1Task = GetData1Async(content, name);
var data2Task = GetData2Async(content);
await Task.WhenAll(data1Task, data2Task);
data1.AddRange(data1Task.Result);
data2.AddRange(data2Task.Result);
}
return (data1, data2);
}
The calling code:
private async Task<(List<SomeModel> data1, List<string> data2)> BatchProcessFilesAsync()
{
var batchSize = 4;
var models
= await GetDataFromSomewhereAsync().ConfigureAwait(false);
var listOfRequests = new List<Task<(List<SomeModel> data1, List<string> data2)>>();
var fileModels = models.ToList();
for (var skip = 0; skip <= fileModels.Count(); skip += batchSize)
{
var files = fileModels.Skip(skip).Take(batchSize);
listOfRequests.Add(ProcessFileAsync(files));
}
// This will run all the calls in parallel to gain some performance
var allFinishedTasks = await
Task.WhenAll(listOfRequests).ConfigureAwait(false);
The problem I am facing is if I need to add data3 in future, i have to add code here again. Is there a way to make this code Solid.
GetDataFromSomewhereAsync
andSomeModel
suggest this is obfuscated code, which is off-topic. \$\endgroup\$