Re: sync over async и ConfigureAwait(false)
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.01.23 16:00
Оценка:
Здравствуйте, MadHuman, Вы писали:


MH>такое поведение вызывает вопросы

MH>1. зачем такое дефолтное поведение в asp.net? ведь при async/await-ах и так подразумевается что после окончания ожидания управление может продолжено свободным потоком из пула.
MH>идея продолжения в исходном хуже и с точки зрения перфа — исходный поток мог уже быть назначен для выполнения другой таски и занят.

Потому что ASP.NET и IIS устроен так, что доступ к контексту запроса возможет только из одного потока. Кроме того, если, не дай бог, вы используете WebForms, то там еще и свой ЖЦ есть и асинхронные вызовы должны сихронизироваться.


MH>в asp.net так не надо, т.е. из-за частного случая сделали неудобное поведение.

Не частного. В общем случае архитектура веб-серверов такова, что каждый запрос обрабатывает выделенный поток.

MH>2. почему нет глобальной настройки? или для рутовой таски указать стратегию для вложенных await-ах?

Конечно есть, SynchronizationContext, подробнее по ссылке https://learn.microsoft.com/en-us/archive/msdn-magazine/2011/february/msdn-magazine-parallel-computing-it-s-all-about-the-synchronizationcontext

MH>3. зачем об этом думать при каждом await ? а .ConfigureAwait(false) надо вызвать при каждом во всей цепочке

Во-первых не в каждом, а только в том, для которого вызывается Wait() или Result.
Во-вторых в общем случае не надо делать sync-over-async. Это всегда признак плохого кода. Возможно не вашего, но все равно плохого.

MH>это какое-то неудачно решение дизайна?

Очень удачное

MH>или есть какие-то причины которые от меня ускользнули?

Конечно. Вообще наивно думать, что Microsoft за 10 лет не вылизал до идеала с точки зрения дизайна и быстродействия всю систему с async\await.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.