public async Task <IActionResult> Upload() { IFormFile file = Request.Form.Files.First(); if (file != null) { //Only one file var path = Path.Combine(hostingEnvironment.WebRootPath, file.FileName); using (var stream = new FileStream(path, FileMode.Create)) { await file.CopyToAsync(stream); } var header = new CalculationHeader { FileName = file.FileName, Status = "Pending", Size = (int)file.Length, UploadTime = DateTime.Now }; await context.CalculationHeaders.AddAsync(header); await context.SaveChangesAsync(); await messageSession.SendLocal(new CalculationCommand { Filename = path, HeaderId = header.Id }); return(Accepted()); } return(BadRequest("No file uploaded")); }
public async Task Handle(CalculationCommand message, IMessageHandlerContext context) { var result = new List <Calculation>(); var errors = new List <CalculationResult> { }; parser.Read(message.Filename).AsParallel().ForAll(line => { try { result.Add(parser.ProcessLine(line)); } catch (Exception ex) { errors.Add(new CalculationResult() { Message = ex.Message, CalculationHeaderId = message.HeaderId, Formular = line.Split(';')[0] }); } }); //Set Completed time var header = await _context.CalculationHeaders.FindAsync(message.HeaderId); header.CompletedTime = DateTime.Now; header.Status = "Processed"; _context.Update(header); await _context.SaveChangesAsync(); //Bulk perfoms better for large records _context.BulkInsert(result.Select(r => new CalculationResult { CalculationHeaderId = message.HeaderId, Formular = r.Formula, InputA = r.A, InputB = r.B, InputC = r.C, Result = Math.Round(r.Result, 2) }).ToList()); if (errors.Any()) { _context.BulkInsert(errors); } }