C# 等待任务列表而不阻止另一个任务列表
我正在编写一段代码,从一个源获取数据,进行一些处理,然后将其保存到另一个源。由于两端都有很高的延迟,我尝试使用async/await来等待加载和保存操作完成。理想情况下,这将启动所有输入任务,当每个任务完成时,它会执行一些快速处理,然后启动输出任务-使用task.WaitAll将导致程序在新任务可以启动时不执行任何操作 因为第二个异步任务取决于第一个任务的结果,所以我不知道如何处理第二个等待,让它恢复处理第一个等待的其他结果-一旦处理了结果,第二个等待被命中,它会完全阻塞,直到完成保存功能,而不是继续处理其他结果。我在尝试这样的事情,我做错了什么C# 等待任务列表而不阻止另一个任务列表,c#,.net,async-await,task,latency,C#,.net,Async Await,Task,Latency,我正在编写一段代码,从一个源获取数据,进行一些处理,然后将其保存到另一个源。由于两端都有很高的延迟,我尝试使用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 */
}
不要等待单个方法,而是使用延续创建列表,然后使用Task.Whalll:
这将以异步方式处理所有任务。不要等待单个方法,而是使用继续创建列表,然后使用任务。所有:
这将以异步方式处理您的所有任务。如果我理解正确,您可以尝试以下方法:
Parallel.Foreach( ids.Select(id => LoadEntryById(id)), (rawEntry) => {
var result = doSomething(rawEntry);
await SaveResult(result);
}
RawEntry LoadEntryById(int id)
{
/* IO task */
}
async Task SaveResult(ProcessedEntry result)
{
/* IO task */
}
在此设置中,LoadEntryById不需要返回任务,但这取决于它正在执行的操作。如果我理解正确,您可以尝试以下操作:
Parallel.Foreach( ids.Select(id => LoadEntryById(id)), (rawEntry) => {
var result = doSomething(rawEntry);
await SaveResult(result);
}
RawEntry LoadEntryById(int id)
{
/* IO task */
}
async Task SaveResult(ProcessedEntry result)
{
/* IO task */
}
在此设置中,LoadEntryById不需要返回任务,但它取决于它正在执行的操作。只是不等待SaveResult?把它放到列表中,最后等待所有的请求。没有理由等待请求,因为请求已经被定义并且有它的数据。第5行获取此时的所有数据并将其加载到列表中。foreach然后从列表中获取每一项。@John Rasch-我对异步内容无论如何都不是专家,但目前只有在LoadEntryById…ToList完成后才能访问foreach。到该点的代码是同步的。第一个“等待”应该在第5行,并且应该使用ToListSyncJust don't Wait SaveResult?把它放到列表中,最后等待所有的请求。没有理由等待请求,因为请求已经被定义并且有它的数据。第5行获取此时的所有数据并将其加载到列表中。foreach然后从列表中获取每一项。@John Rasch-我对异步内容无论如何都不是专家,但目前只有在LoadEntryById…ToList完成后才能访问foreach。到该点的代码是同步的。第一个“等待”应该在第5行,并且应该使用ToListSync