【问题标题】:How much of a performance hit is there when calling async methods that are immediately waited on?调用立即等待的异步方法时会有多少性能损失?
【发布时间】:2013-10-26 12:31:43
【问题描述】:

许多 API 正朝着仅公开异步方法的方向发展。在您必须立即等待这些方法的情况下,性能会受到多少影响?假设它导致当前线程等待生成的线程完成,我错了吗?或者 CLR 是否在这些场景中执行某种魔法并使其全部在同一个线程中执行?

【问题讨论】:

  • 你的意思是阻塞等待,即task.Wait(),还是异步“等待”,即await task
  • task.Wait()。我正在执行此操作的方法无法调用await,因为它无法生成async
  • 那你为什么要调用异步方法呢?没有同步版本可以调用吗?请向我们展示您是如何启动异步方法的,具体取决于它的启动方式,可能会发生不同的事情。
  • 通常如果你使用async/await,整个调用链应该是异步的。您可以在顶层使用Wait 阻止,例如在控制台应用程序的Main 中。你究竟会在哪里阻塞(如果你应该阻塞的话)取决于你的代码执行环境。
  • @ScottChamberlain 没有可调用的同步版本。我的问题的第一句话有点暗示。

标签: c# .net multithreading async-await


【解决方案1】:

“异步方法”是指基于 Task<T> 的异步方法。

因此,如果您有一个返回 Task<T> 的方法,并且您立即调用其 Wait() 方法,则会导致当前 that 等待内部 WaitHandle 对象。该任务很可能在不同的线程上执行,并在完成时向WaitHandle 发出信号,从而释放等待线程。没有编译器优化可以将此场景转换为我所知道的同步调用。

这当然比调用异步方法的同步等效项要多。但是,根据您的用例,它可能不会有显着差异。

更重要的问题是你为什么要通过阻塞调用线程来失去异步的优势?这通常不是一个好主意,您应该确保有充分的理由这样做。

【讨论】:

  • 这是一个别无选择,只能立即等待任务的场景。具体来说,我在Application_PostAuthenticateRequestGlobal.asax 中这样做。
  • @w.brian,我在这方面的经验有限,但我认为您可以通过RegisterAsyncTaskmore details 在 ASP.NET 4.5 事件处理程序中使用async 任务。
  • 其实Task好像没有使用任何WaitHandle,它使用ManualResetEventSlim。但这并没有太大的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多