Является ли ConfigureAwait(false) необходимым / полезным при ожидании асинхронных вызовов в функциях Azure
Обычно рекомендуется использовать ConfigureAwait(false)
при ожидании асинхронных вызовов, когда контекст не требуется. Просто интересно, есть ли польза от использования ConfigureAwait(false)
в функциях Azure.
Потоки функции Azure имеют ненулевое значение SynchronizationContext
как таковой было бы полезно использовать ConfigureAwait(false)
чтобы избежать ненужного захвата и повторного планирования продолжения ожидания на захваченном SynchronizationContext
?
Это немного взбалтывать, чтобы добавить ConfigureAwait(false)
в конце каждого асинхронного вызова, поэтому предпочитайте избегать его для кода, который выполняется в функциях Azure, если нет перфорации или любого другого связанного усиления.
Глядя на код хоста лазурной функции: https://github.com/Azure/azure-functions-host/blob/918b057707acfb842659c9dad3cef0193fae1330/src/WebJobs.Script.WebHost/WebScriptHostManager.cs#L181
похоже, что хост-функция Azure пытается удалить ASP.NET SynchronizationContext перед вызовом функции Azure.
1 ответ
Просто интересно, есть ли преимущество использования ConfigureAwait(false) в функциях Azure.
Нет, если ваш код знает, что он работает в этом контексте, нет.
В моем коде функций Azure я делю его на код "library-ish" в отдельных проектах библиотеки и код "функций Azure". Я использую ConfigureAwait(false)
в проектах библиотеки, поскольку их можно (по крайней мере, теоретически) использовать в других приложениях.
Но для кода, который знает, что он работает в функциях Azure, нет ConfigureAwait(false)
является необходимым. Хост v1 удалит SynchronizationContext
и хост v2 работает на ASP.NET Core, у которого нет контекста с самого начала.