Является ли 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, у которого нет контекста с самого начала.