[英]c# async await strange warning CS1998: This async method lacks 'await' operators
我是异步编程的新手,我在这种方法中收到以下警告,有人知道为什么会这样吗? 非常感谢。
public async Task<List<T1>> StartSearchAsync()
{
....other code
searchRequests.ForEach(async s => {
products.AddRange(await SinglePageSearch(s));
});
return products;
}
警告 CS1998:此异步方法缺少“等待”运算符,将同步运行。 考虑使用“await”运算符来等待非阻塞 API 调用,或“await Task.Run(...)”在后台线程上执行 CPU 密集型工作。
您的await
在 lambda 表达式中,这是另一个 function 完全属于您的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;
}
使用这种方法, Task.WhenAll
枚举由Select
生成的Task
,并创建另一个Task
在每个SinglePageSearch
完成时完成。
现在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();
}
编译器告诉您,您可以安全地从方法签名中删除async
关键字,因为您没有直接在StartSearchAsync()
方法中使用await
关键字。
您确实在为ForEach
传递的委托中使用了await
,但这不会影响StartSearchAsync()
方法的编译。
async
关键字仅用于使您能够await
您标记为async
的方法或委托中的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.