public async Task ProcessSheet(Stream file) { using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(file, false)) { S sheets = mySpreadsheet.WorkbookPart.Workbook.Sheets; Task[] tasks = new Task[sheets.Count()]; int i = 0; // For each sheet, display the sheet information. foreach (E sheet in sheets) { var sheetName = string.Empty; try { sheetName = sheet.GetAttributes().First(c => c.LocalName == "name").Value; var sheetId = sheet.GetAttributes().First(c => c.LocalName == "id").Value; log.Info($"Sheet Founded: name: {sheetName}, id: {sheetId}"); tasks[i] = ReadExcelSheet(mySpreadsheet, sheetId); i++; log.Info($"Sheet {sheetName} add to queue process"); } catch (Exception ex) { log.Error($"Error on process sheet {sheetName} -> {ex}"); } } Task.WaitAll(tasks); log.Info($"End of file process"); } }