c# async wait奇怪警告CS1998:此异步方法缺少“等待”运算符

1 c# asynchronous async-await

我是异步编程的新手,我在此方法中收到以下警告,有人知道为什么会发生这种情况吗?非常感谢。

   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 密集型工作。

Joh*_*lay 6

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)