public async Task SetFileLabelsBatch([FromBody] RequestMultiFileSet req) { return await CreateResponseAsync(async () => { Stopwatch sw = new Stopwatch(); sw.Start(); _log.LogWarning($"*** Start SetFileLabelsBatch: {req.files.Count} EA."); // Divide files into smaller batches (e.g., 10 files per batch) int batchSize = 10; var fileBatches = req.files.Select((file, index) => new { file, index }) .GroupBy(x => x.index / batchSize) .Select(g => g.Select(x => x.file).ToList()) .ToList(); var tasks = new List>>(); foreach (var batch in fileBatches) { tasks.Add(ProcessFileBatchAsync(batch)); } await Task.WhenAll(tasks); var result = tasks.SelectMany(t => t.Result).ToList(); HttpContext.Items[GlobalConstants.API_RESULT_CODE] = 0; HttpContext.Items[GlobalConstants.API_RESULT_MESSAGE] = GlobalConstants.API_RESULT_SUCCESS; sw.Stop(); _log.LogWarning($"*** ...End SetFileLabelsBatch: {req.files.Count} EA. {sw.ElapsedMilliseconds} ms."); return Results.Ok(new ApiResponseModel>() { success = true, errorCode = 0, errorMessage = GlobalConstants.API_RESULT_SUCCESS, result = result, }); }); } private async Task> ProcessFileBatchAsync(List batch) { var tasks = batch.Select(obj => { RequestFileSet reqSet = new RequestFileSet { apiKey = req.apiKey, email = req.email, decryptKey = req.decryptKey, aipGuid = req.aipGuid, comment = req.comment, file = new RequestFile { dispFileName = obj.dispFileName, realFileName = obj.realFileName, } }; return _apiFileService.SetLabel(reqSet); }); await Task.WhenAll(tasks); return tasks.Select(task => task.Result).ToList(); }