TaskBatch.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. public async Task<IResult> SetFileLabelsBatch([FromBody] RequestMultiFileSet req)
  2. {
  3. return await CreateResponseAsync(async () =>
  4. {
  5. Stopwatch sw = new Stopwatch();
  6. sw.Start();
  7. _log.LogWarning($"*** Start SetFileLabelsBatch: {req.files.Count} EA.");
  8. // Divide files into smaller batches (e.g., 10 files per batch)
  9. int batchSize = 10;
  10. var fileBatches = req.files.Select((file, index) => new { file, index })
  11. .GroupBy(x => x.index / batchSize)
  12. .Select(g => g.Select(x => x.file).ToList())
  13. .ToList();
  14. var tasks = new List<Task<List<ResponseFile>>>();
  15. foreach (var batch in fileBatches)
  16. {
  17. tasks.Add(ProcessFileBatchAsync(batch));
  18. }
  19. await Task.WhenAll(tasks);
  20. var result = tasks.SelectMany(t => t.Result).ToList();
  21. HttpContext.Items[GlobalConstants.API_RESULT_CODE] = 0;
  22. HttpContext.Items[GlobalConstants.API_RESULT_MESSAGE] = GlobalConstants.API_RESULT_SUCCESS;
  23. sw.Stop();
  24. _log.LogWarning($"*** ...End SetFileLabelsBatch: {req.files.Count} EA. {sw.ElapsedMilliseconds} ms.");
  25. return Results.Ok(new ApiResponseModel<List<ResponseFile>>()
  26. {
  27. success = true,
  28. errorCode = 0,
  29. errorMessage = GlobalConstants.API_RESULT_SUCCESS,
  30. result = result,
  31. });
  32. });
  33. }
  34. private async Task<List<ResponseFile>> ProcessFileBatchAsync(List<RequestFile> batch)
  35. {
  36. var tasks = batch.Select(obj =>
  37. {
  38. RequestFileSet reqSet = new RequestFileSet
  39. {
  40. apiKey = req.apiKey,
  41. email = req.email,
  42. decryptKey = req.decryptKey,
  43. aipGuid = req.aipGuid,
  44. comment = req.comment,
  45. file = new RequestFile
  46. {
  47. dispFileName = obj.dispFileName,
  48. realFileName = obj.realFileName,
  49. }
  50. };
  51. return _apiFileService.SetLabel(reqSet);
  52. });
  53. await Task.WhenAll(tasks);
  54. return tasks.Select(task => task.Result).ToList();
  55. }