簡體   English   中英

c# 異步等待奇怪的警告 CS1998:此異步方法缺少“等待”運算符

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM