[英]Run async await tasks in parallel in Asp.net Core
List<Employee> employeeList = new List<Employee>();
List<Event> eventList = new List<Event>();
//Wanted to execute each foreach call asynchronously, to improve performance
foreach (var account in accounts)
{
var context = await GetContext(account);
//following two await is depends on above result
var employees = await _employeeService.List(context);
var events = await _eventService.List(context).ConfigureAwait(false);
//Question is how to execute above two await calls parallely
employeeList.AddRange(employees);
eventList.AddRange(events);
}
我想同时启动两个长期运行的任务(员工和事件)。 那么也许我们可以为上面的每个帐户实现并行执行来解决这个问题?
如果您只希望循环内的每个调用并行 -
List<Employee> employeeList = new List<Employee>();
List<Event> eventList = new List<Event>();
foreach (var account in accounts)
{
var context = await GetContext(account);
var employeesTask = _employeeService.List(context);
var eventsTask = _eventService.List(context);
await Task.WhenAll(employeesTask , events).ConfigureAwait(false);
var employees = await employeesTask.ConfigureAwait(false);
var events= await eventsTask.ConfigureAwait(false);
employeeList.AddRange(employees);
eventList.AddRange(events);
}
您可以将每次迭代的执行安排为TAsk
并将其放入数组,然后使用Task.WhenAll
,如下所示:
var tasks = new List<Task>();
//Wanted to execute each foreach call asynchronously, to improve performance
foreach (var account in new int[] { 1 })
{
tasks.Add(
Task.Run(async () =>
{
var context = await GetContext(account);
//following two await is depends on above result
var employees = await _employeeService.List(context);
var events = await _eventService.List(context).ConfigureAwait(false);
//Question is how to execute above two await calls parallely
employeeList.AddRange(employees);
eventList.AddRange(events);
}));
}
await Task.WhenAll(tasks);
警告:您必须确保employeeList
和eventList
是线程安全的。
你甚至可以在一个单独的方法中包装循环迭代(你可以在你的方法中定义它)以使代码更清晰:
await Task.WhenAll(accounts.Select(a => loopIteration(a)));
async Task loopIteration(Account account)
{
var context = await GetContext(account);
//following two await is depends on above result
var employees = await _employeeService.List(context);
var events = await _eventService.List(context).ConfigureAwait(false);
//Question is how to execute above two await calls parallely
employeeList.AddRange(employees);
eventList.AddRange(events);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.