Обновление: ASP.NET Core не имеетSynchronizationContext
. Если вы используете ASP.NET Core, не имеет значения, используете вы его ConfigureAwait(false)
или нет.
Для ASP.NET "Полный" или "Классический" или что-то еще, остальная часть этого ответа все еще применяется.
Оригинальный пост (для не Core ASP.NET):
Это видео от команды ASP.NET содержит лучшую информацию об использовании async
в ASP.NET.
Я читал, что он более производительный, так как он не должен переключать контексты потока обратно в исходный контекст потока.
Это верно для приложений пользовательского интерфейса, где есть только один поток пользовательского интерфейса, с которым вы должны «синхронизироваться» обратно.
В ASP.NET ситуация немного сложнее. Когда async
метод возобновляет выполнение, он получает поток из пула потоков ASP.NET. Если вы отключите захват контекста с помощью ConfigureAwait(false)
, тогда поток просто продолжит выполнение метода напрямую. Если вы не отключите захват контекста, поток повторно введет контекст запроса и продолжит выполнение метода.
Так ConfigureAwait(false)
что не спасает вас от скачка потока в ASP.NET; это спасает вас от повторного ввода контекста запроса, но обычно это происходит очень быстро. ConfigureAwait(false)
может быть полезно, если вы пытаетесь выполнить небольшую параллельную обработку запроса, но на самом деле TPL лучше подходит для большинства этих сценариев.
Однако в ASP.NET Web Api, если ваш запрос поступает в один поток, и вы ожидаете какую-то функцию и вызываете ConfigureAwait (false), которая потенциально может перевести вас в другой поток, когда вы возвращаете конечный результат вашей функции ApiController ,
На самом деле, просто сделать это await
может сделать это. Как только ваш async
метод достигает await
, метод блокируется, но поток возвращается в пул потоков. Когда метод готов продолжить, любой поток вырывается из пула потоков и используется для возобновления метода.
Единственное отличие ConfigureAwait
в ASP.NET заключается в том, входит ли этот поток в контекст запроса при возобновлении метода.
У меня есть дополнительная справочная информация в моей статье на MSDNSynchronizationContext
и в моем async
вступительном блоге .
HttpContext.Current
передается ASP.NETSynchronizationContext
, который по умолчанию передается вамawait
, но не передаетсяContinueWith
. Ото, контекст исполнения ( в том числе ограничений безопасности) контекст упоминается в CLR с помощью C #, и это текло обаContinueWith
иawait
(даже если вы используетеConfigureAwait(false)
).