等待一个任务列表而不阻塞另一个任务列表

0 .net c# latency task async-await

我正在编写一段代码,从一个来源获取数据,进行一些处理,然后将其保存到不同的来源。由于两端的延迟水平很高,我尝试使用 async/await 等待加载和保存操作完成。理想情况下,这将启动所有输入任务,当每个任务完成时,它会进行一些快速处理,然后启动输出任务 - 使用 Task.WaitAll 会导致程序在新任务开始时不做任何事情。

由于第二个异步任务取决于第一个的结果,我无法弄清楚如何处理第二个等待,让它恢复处理第一个等待的其他结果 - 一旦结果被处理,第二个等待被击中,它会完全阻塞,直到保存功能完成,而不是继续处理其他结果。我正在尝试这样的事情,我做错了什么?

async Task MainAsync()
{
    /* gets a list of id's */

    var dataRequests = ids.Select(id => LoadEntryById(id)).ToList();

    foreach(var request in dataRequests)
    {
        RawEntry response = await request;

        ProcessedEntry result = doSomething(response);

        await SaveResult(result);
    }
}

async Task<RawEntry> LoadEntryById(int id)
{
    /* IO task */
}

async Task SaveResult(ProcessedEntry result)
{
    /* IO task */
}
Run Code Online (Sandbox Code Playgroud)

Fed*_*uma 5

不要等待单个方法,而是List<Task>使用延续创建您的方法,然后使用Task.WhenAll

var tasks = ids.Select(async id => {
    var response = await LoadEntryById(id);
    var result = doSomething(response);
    await SaveResult(result);
}).ToList();

await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)

这将以异步方式处理您的所有任务。