等待Azure函数中的异步调用时是否需要/有利于ConfigureAwait(false)

时间:2019-04-05 19:15:10

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

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

Azure函数线程是否具有非空的SynchronizationContext,这样使用ConfigureAwait(false)以避免不必要地捕获它并在捕获的SynchronizationContext上重新安排等待继续会有益吗? / p>

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

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

似乎azure函数主机试图在调用azure函数之前剥离ASP.NET SynchronizationContext。

1 个答案:

答案 0 :(得分:2)

  

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

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

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

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