[英]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.