【问题标题】:async calls not awaited inside foreach [closed]foreach 内部未等待异步调用 [关闭]
【发布时间】:2019-06-28 20:13:52
【问题描述】:

在我的 c# 代码中,不会每次都在等待来自 for each 内部的异步调用。

代码

private async Task GetCardInfo()
{
  try
  {
     var result = await DoTask1();
     var info = await DoTask2();
     foreach (var inf in info)
     {
        await DoTask3();
     }
   }
   catch (Exception ex){ }
}

DoTask1();DoTask2(); 总是被等待,但 DoTask3(); 有时会被等待,有时却不是。我认为问题出在DoTask3();,但如果我将DoTask1(); 放入foreach 循环中,我也会遇到类似的问题。我是不是做错了什么?

该问题仅在从 foreach 循环内部调用时发生,如果从 foreach 循环外部调用这些函数,则会按预期等待。

谁能给点建议?

【问题讨论】:

  • 你能提供一个Minimal, reproducible example吗?
  • DoTask3 会扔吗?
  • catch (Exception ex){ } 永远不要这样做,也不要把它放在一个问题中,因为这只是意味着我们必须向您询问更多关于您可能丢弃重要异常的可能性

标签: c# async-await c#-5.0


【解决方案1】:

我的猜测是:

  1. 信息集合为空(长度为 0),因此未执行 foreach 正文。
  2. 有人抛出异常(可能在 DoTask2 或 info 枚举器中),该异常正在跳转到您的捕获处,从而跳过了 foreach 主体。

要验证这一点,请在调试器下运行它或添加一些 Console.WriteLines()。

【讨论】:

  • 总之,排除外星人神秘盗取密码的可能性,真的只有这2个选项+1
  • async void
  • @StephenCleary 哦,是的,确实,很高兴看到你再次参观 SO 的大厅
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 2017-12-07
  • 2022-11-01
  • 2021-12-20
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多