我是异步编程的新手,我在此方法中收到以下警告,有人知道为什么会发生这种情况吗?非常感谢。
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)
归档时间: |
|
查看次数: |
3383 次 |
最近记录: |