Re[2]: sync over async и ConfigureAwait(false)
От: MadHuman Россия  
Дата: 02.01.23 17:03
Оценка:
Здравствуйте, 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 назад, и некоторые вещи остались как есть.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.