繁体   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