Где асинхронные продолжения ставятся в очередь в ASP.NET Core?

В устаревшей версии ASP.NET продолжение асинхронного метода ставится в очередь в контексте запроса (AspNetSynchronizationContext). Но в ASP.NET Core такого SynchronizationContext (бесконтекстного) нет.

Итак, где асинхронные продолжения ставятся в очередь в ASP.NET Core?

В этом бесконтекстном условии, где хранится HttpContext информация, чтобы потоки из ThreadPool могли ссылаться на нее?


person tuq    schedule 21.12.2018    source источник
comment
HttpContext не хранится централизованно; он хранится в каждом экземпляре класса контроллера.   -  person SLaks    schedule 21.12.2018
comment
@Slaks, не могли бы вы рассказать мне подробнее? Я думаю, что есть способ для нескольких потоков использовать объект HttpContext, верно? Итак, в каком именно потоке хранится объект HttpContext? Благодарю вас!   -  person tuq    schedule 04.01.2019
comment
Такого механизма не существует. Вместо этого вы получаете доступ к контексту из своего класса, который сохраняет его в поле.   -  person SLaks    schedule 04.01.2019


Ответы (1)


Я настоятельно рекомендую вам прочитать блог Стивен Клири и даже его книгу. В этой публикации он рассказывает о контексте синхронизации в ASP.NET. Основной.

Я выделяю этот абзац:

При использовании бесконтекстного подхода ASP.NET Core, когда асинхронный обработчик возобновляет выполнение, поток берется из пула потоков и выполняет продолжение. Очередь контекста избегается, и нет необходимости «входить» в контекст запроса. Кроме того, механизм async/await оптимизирован для бесконтекстного сценария. Для асинхронных запросов просто меньше работы.

person hardkoded    schedule 21.12.2018
comment
Спасибо @harkoded за предложение, я уже читал его пост. Мне просто интересно, как HttpContext может работать в ASP.NET Core, если он бессерверен (где хранится информация HttpContext, чтобы на нее могли ссылаться потоки из ThreadPool?). В устаревшем ASP.NET мы можем получить доступ к объекту HttpContext только в том случае, если мы находимся в потоке пользовательского интерфейса. Доступ к System.Web.HttpContext.Current.Items["abc"] вызовет исключение, если мы не в потоке пользовательского интерфейса. Обратитесь к stackoverflow.com/questions/29268001/ - person tuq; 22.12.2018