当前位置: 首页 > 知识库问答 >
问题:

C#async await奇怪警告CS1998:此异步方法缺少await操作符

柴嘉年
2023-03-14
   public async Task<List<T1>> StartSearchAsync()
    {
        ....other code

        searchRequests.ForEach(async s => {
            products.AddRange(await SinglePageSearch(s));
        });

        return products;
    }

共有1个答案

鲜于阳
2023-03-14

您的await位于一个lambda表达式中,该表达式完全是startSearchAsync方法的另一个函数。

事实上,您不应该将异步委托传递给列表 .foreach ,因为这样会将委托转换为异步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生成的任务,并创建另一个任务,该任务在每个SinglePageSearch完成时完成。

现在StartSearchAsync可以等待它们的完成。

如果products只是一个用于合并结果的空列表,则可以进一步简化:

public async Task<List<T1>> StartSearchAsync()
{
    ....other code
    
    var results = await Task.WhenAll(searchRequests.Select(SinglePageSearch));

    return results.SelectMany(x => x).ToList();
}
 类似资料: