簡體   English   中英

在 Asp.net Core 中並行運行異步等待任務

[英]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);

警告:您必須確保employeeListeventList是線程安全的。

你甚至可以在一個單獨的方法中包裝循環迭代(你可以在你的方法中定義它)以使代碼更清晰:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM