不等待lambda foreach中的异步调用

格里夫博士

我有以下方法在完成之前返回(为简便起见,方法已减少):

private void ProcessAllItems(List<Item> items)
{
    items.ForEach(async item =>
    {
        var response = await Processor.IOBoundTaskAsync(item);
        // Some further processing on the response object.
    });
}

Processor.IOBoundTaskAsync方法返回Task <SomeResponseObject>,因此不会返回void。

那么,发生了什么事?

我希望lambda foreach一次处理每个项目,所以不要并行处理。对于第一次迭代,代码进入IOBoundTaskAsync并到达第一个“等待”(在其中调用4个等待的Web服务方法中的第一个),然后退出调用方法“ ProcessAllItems”。

我仅使用测试数据,因此列表中只有1个项目。

我想念什么?

尤瓦尔·伊茨恰科夫(Yuval Itzchakov)

List<T>.ForEach将您的异步lambda转换为async void,因为它接受Action<T>尽管这样做可以使异常处理变得有些复杂,但是您的ForEach调用应该可以正常工作。否则,您可能无法正确使用异步模式。我建议您在第一个断点之后设置一个断点,await然后继续执行。

我建议您改用常规的foreach

private async Task ProcessAllItemsAsync(List<Item> items)
{
    foreach (var item in items)
    {
       var response = await Processor.IOBoundTaskAsync(item);
       // Some further processing on the response object.
    }
}

阅读如何在ForEach中使用异步?更多。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法等待异步调用中的对象

来自分类Dev

AngularJS等待foreach中的所有异步调用完成

来自分类Dev

异步/等待不等待

来自分类Dev

异步等待不等待

来自分类Dev

异步等待不等待

来自分类Dev

异步等待不等待

来自分类Dev

AngularJS:等待异步调用

来自分类Dev

等待Scala应用程序中的异步调用终止

来自分类Dev

等待GWT异步调用中的数据库结果

来自分类Dev

等待XCTestCase的setUp()中的多个异步调用

来自分类Dev

JestJs不等待调用包装异步/等待

来自分类Dev

如何处理 lambda nodejs 中的异步调用

来自分类Dev

异步等待不等待解决

来自分类Dev

异步方法中的最后一个异步调用需要等待吗?

来自分类Dev

如何同步调用异步(等待)方法?

来自分类Dev

在快速脚本中等待异步调用

来自分类Dev

如何同步调用异步(等待)方法?

来自分类Dev

等待多个异步调用完成?

来自分类Dev

调用方法异步而不等待应答

来自分类Dev

调用方法异步而不等待应答

来自分类Dev

如何从另一个 lambda 函数调用 AWS lambda 函数并返回而不等待被调用的 lambda 结果

来自分类Dev

如何异步调用AWS Lambda函数

来自分类Dev

如何异步调用AWS Lambda函数

来自分类Dev

返回不等待异步功能

来自分类Dev

异步函数不等待 await

来自分类Dev

异步等待不等待函数完成

来自分类Dev

异步 - 等待不等待承诺解决

来自分类Dev

JS(node.js)-如果我进行异步调用但不等待其完成,是否可以保证完成执行?

来自分类Dev

JS(node.js)-如果我进行异步调用但不等待其完成,是否可以保证完成执行?