【问题标题】:What is the benefit of putting async on a WebAPI controller action that performs no await operations?将异步放在不执行等待操作的 WebAPI 控制器操作上有什么好处?
【发布时间】:2021-01-16 23:38:45
【问题描述】:

我最近被问到一个关于 .NET WebAPI 的面试问题,它是这样的......

面试官:

async 添加到执行任何异步操作的 WebAPI 控制器操作的方法签名有什么好处?

我的回答:

不,因为方法中没有阻塞代码,这意味着控制器动作应该在线程池中的自己的线程中同步运行。对吗?

面试官:

不,实际上不是。

我在网上搜索了大约 15-20 分钟以找到一个确定的答案,但对答案并不完全满意......那么,我是对的还是面试官是对的?

为了进一步澄清这个问题:在这种情况下,负载测试 WebAPI 控制器操作是否会在负载下执行得更好,只是因为它在签名中有一个 async 关键字位置,即使它没有异步代码?

【问题讨论】:

  • 你是对的。
  • 在这种情况下,我会在之后对面试官说。 “谢谢这个问题:(无论如何)。我不知道这一点。你能给我发一个链接到一篇文章的链接吗?”
  • 您能否将其发布为答案,以便获得一些 SO 信用? @SLaks
  • async 修饰符本身没有任何作用。
  • 谢谢@mjwills。这是一个很好的后续问题。

标签: c# asp.net-web-api


【解决方案1】:

async 修饰符本身没有任何作用。

来自docs

如果async 关键字修改的方法不包含await 表达式或语句,则该方法同步执行。编译器警告会提醒您注意任何不包含 await 语句的 async 方法,因为这种情况可能表示错误。

【讨论】:

  • “什么都没做有用”我会说。一个小测试表明为不包含任何awaitasync 方法生成了大量IL。如果编译器没有检测到await,不确定为什么会生成状态机
  • @CamiloTerevinto 您是否使用激活的优化(发布模式)或调试模式对此进行了测试?
  • 是的,Debug和Release生成同一个IL(也就是和状态机有关)
【解决方案2】:

你是对的,没有awaitasync 将是在当前线程(不是新线程)上运行的Task,直到最后基本上=同步运行。

如果您真的想考虑所有内容,那么将其标记为异步会增加创建 Task 的完全可忽略的开销

【讨论】:

  • 编译器将使用 Task.FromResult 将返回值包装在任务中,或者如果没有返回值使用 Task.Completed,即任务将在其完成状态下创建,而无需运行。
猜你喜欢
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2019-07-04
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多