【问题标题】:Is ConfigureAwait(false) needed/beneficial when awaiting async calls in Azure Functions在 Azure Functions 中等待异步调用时是否需要/有益的 ConfigureAwait(false)
【发布时间】:2019-08-27 17:58:09
【问题描述】:

通常建议在不需要上下文时等待异步调用时使用ConfigureAwait(false)。只是想知道在 Azure Functions 中使用 ConfigureAwait(false) 有什么好处。

Azure Function 线程是否具有非空 SynchronizationContext,因此使用 ConfigureAwait(false) 以避免不必要地捕获它并将等待继续重新安排回捕获的 SynchronizationContext 上会很有帮助?

在每次异步调用的末尾添加ConfigureAwait(false) 有点麻烦,因此如果没有性能/或任何其他相关增益,则更愿意避免在 Azure Functions 中运行的代码使用它。

看azure函数宿主代码: https://github.com/Azure/azure-functions-host/blob/918b057707acfb842659c9dad3cef0193fae1330/src/WebJobs.Script.WebHost/WebScriptHostManager.cs#L181

似乎 azure function host 在调用 azure function 之前尝试剥离 ASP.NET SynchronizationContext。

【问题讨论】:

  • 关于使用ConfigureAwait(false) 获取服务器端代码的任何来源?我记得,情况恰恰相反。
  • 参考这里:msdn.microsoft.com/en-us/magazine/jj991977.aspx 建议尽可能使用它,但需要实际上下文的方法除外。尽管如此,这个问题是针对 azure 函数的。

标签: async-await azure-functions azure-functions-runtime synchronizationcontext azure-function-async


【解决方案1】:

只是想知道在 Azure Functions 中使用 ConfigureAwait(false) 有什么好处。

如果您的代码知道它在该上下文中运行,则不会。

在我的 Azure Functions 代码中,我将其分为单独的库项目中的“类库”代码和“Azure Functions”代码。我确实在库项目中使用了ConfigureAwait(false),因为它们可以(至少在理论上)在其他应用程序中被重用。

但是对于知道它在 Azure Functions 中运行的代码,不需要 ConfigureAwait(false)。 v1 主机将删除SynchronizationContext,v2 主机在没有上下文开始的 ASP.NET Core 上运行。

【讨论】:

  • 另外,在编排函数中等待ActivityFunctions 时,不要将ConfigureAwaitDurableFunctions 一起使用。见https://github.com/MicrosoftDocs/azure-docs/issues/24080
  • 这很有帮助。 “v1 主机会去掉 SynchronizationContext”是什么意思?
  • @gabe:v1 主机是一个 ASP.NET WebAPI 进程(至少对于 HTTP 触发的函数)。但在它调用你的函数代码之前,它会故意删除 ASP.NET SynchronizationContext
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
相关资源
最近更新 更多