我是异步编程的新手,我在此方法中收到以下警告,有人知道为什么会发生这种情况吗?非常感谢。
public async Task<List<T1>> StartSearchAsync()
{
....other code
searchRequests.ForEach(async s => {
products.AddRange(await SinglePageSearch(s));
});
return products;
}
Run Code Online (Sandbox Code Playgroud)
警告 CS1998:此异步方法缺少“等待”运算符,并将同步运行。考虑使用“await”运算符等待非阻塞 API 调用,或使用“await Task.Run(...)”在后台线程上执行 CPU 密集型工作。
您await位于 lambda 表达式中,这完全是您的StartSearchAsync方法的另一个函数。
事实上,您不应该将async委托传递给List<T>.ForEach,因为这会将委托转换为async void,这是不可取的,因为调用方法无法等待委托完成。
更好的选择是将Enumerable.Select, 与 结合使用Task.WhenAll:
public async Task<List<T1>> StartSearchAsync()
{
....other code
var tasks = searchRequests.Select(SinglePageSearch);
var results = await Task.WhenAll(tasks);
foreach (result in results) products.AddRange(result);
return products;
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,Task.WhenAll枚举Task由 生成的 s Select,并创建另一个Task在每个 sSinglePageSearch完成后完成的 s。
现在StartSearchAsync可以将await它们完成。
如果products只是使用一个空列表来合并结果,则可以进一步简化:
public async Task<List<T1>> StartSearchAsync()
{
....other code
var results = await Task.WhenAll(searchRequests.Select(SinglePageSearch));
return results.SelectMany(x => x).ToList();
}
Run Code Online (Sandbox Code Playgroud)