public async Task GenerateUserActivityReport(MessageContext context, AggregateUserActivityReportDataEvent inputEvent) { var accounts = await reportsDataFetcher.GetAccounts(context.FlowId, inputEvent.UserId); var accountsIds = accounts.Select(a => a.Id).ToArray(); var data = new UserActivityRaportData { From = inputEvent.TimestampFrom, To = inputEvent.TimestampTo, Granularity = inputEvent.Granularity, Accounts = accounts, UserId = inputEvent.UserId }; var filters = new Filters { Recipients = accountsIds.ToHashSet(), Senders = accountsIds.ToHashSet(), TimestampFrom = inputEvent.TimestampFrom, TimestampTo = inputEvent.TimestampTo }; var parallelTasks = new List <Task>(); parallelTasks.Add(Task.Run(() => data.Transactions = transactionsRepository.GetMany(filters, null))); parallelTasks.Add(Task.Run(async() => data.Payments = await reportsDataFetcher.GetPayments(context.FlowId + "_p", accountsIds))); parallelTasks.Add(Task.Run(async() => data.Loans = await reportsDataFetcher.GetLoans(context.FlowId + "_l", accountsIds))); parallelTasks.Add(Task.Run(async() => data.Cards = await reportsDataFetcher.GetCards(context.FlowId + "_c", accountsIds))); await Task.WhenAll(parallelTasks); var portions = ReportGenerator.AggregateUserActivity(data); publishingRouter.Publish(context.ReplyTo, portions, context.FlowId); }