Здравствуйте, gandjustas, Вы писали:
MH>>1. зачем такое дефолтное поведение в asp.net? ..
G>Потому что ASP.NET и IIS устроен так, что доступ к контексту запроса возможет только из одного потока.
это не так. доступ из разных потоков возможен. проблемы могут быть при одновременном доступе из разных потоков, но это не относится к async/await.
G>Кроме того, если, не дай бог, вы используете WebForms, то там еще и свой ЖЦ есть и асинхронные вызовы должны сихронизироваться.
тут незнаю, но к счастью не мой кейс.
MH>>в asp.net так не надо, т.е. из-за частного случая сделали неудобное поведение.
G>Не частного. В общем случае архитектура веб-серверов такова, что каждый запрос обрабатывает выделенный поток.
дак нет же. при асинхронности, продолжить выполнение может другой свободный поток пула и это лучше и с точки зрения перфа.
частный случая типа легаси типа WebForms (если там конечно так) — частный случай.
MH>>2. почему нет глобальной настройки? или для рутовой таски указать стратегию для вложенных await-ах?
G>Конечно есть, SynchronizationContext, подробнее по ссылке https://learn.microsoft.com/en-us/archive/msdn-magazine/2011/february/msdn-magazine-parallel-computing-it-s-all-about-the-synchronizationcontext
спасибо почитаю, но я проверял и перед вызовом асинк-метода SynchronizationContext пуст ( SynchronizationContext.Current — null).
MH>>3. зачем об этом думать при каждом await ? а .ConfigureAwait(false) надо вызвать при каждом во всей цепочке
G>Во-первых не в каждом, а только в том, для которого вызывается Wait() или Result.
это не так. для таска, для которого вызывается .Result — не срабатывает (только что проверил).
а вот если внутри async есть await и у него вызвано .ConfigureAwait(false) — то внутри уже действительно можно не вызывать .ConfigureAwait(false)
G>Во-вторых в общем случае не надо делать sync-over-async. Это всегда признак плохого кода. Возможно не вашего, но все равно плохого.
понятно что лучше делать всю цепочку async. но к сожалению бывает когда это разным причинам неудастся.
MH>>или есть какие-то причины которые от меня ускользнули?
G>Конечно. Вообще наивно думать, что Microsoft за 10 лет не вылизал до идеала с точки зрения дизайна и быстродействия всю систему с async\await.
не сильно ошибусь если скажу что развитие .net framework остановилось лет 5 назад, и некоторые вещи остались как есть.