Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 13

Асинхронные контроллеры

19.08.2015, 23:17. Показов 3358. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не совсем понимаю как работают асинхронные контроллеры в ASP.NET MVC.
Допустим есть два action method-а. Один синхронный второй асинхронный.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public ActionResult BookList()
        {
            IEnumerable<Book> books = db.Books;
            ViewBag.Books = books;
            return View();
        }
 
        // асинхронный метод
        public async Task<ActionResult> BookListAsync()
        {
            IEnumerable<Book> books = await Task.Run(() => db.Books);
            ViewBag.Books = books;
            return View("Index");
        }
Веб-сервер поддерживает пул потоков, которые обслуживают запросы. Когда пользователь обращается к веб-ресурсу, веб-сервер выделяет поток из пула для обслуживания данного запроса. И пока данный поток не обработает предназначенный для него запрос, другие запросы он обрабатывать не может.
Запрос к db.Books сам по себе может занять некоторое время.
1 случай: При синхронной обработке запроса поток, обрабатывающий запрос, временно блокируется, пока БД не вернет нужные нам данные. И если обработка запроса блокируется очень долго, то IIS начинает задействовать для обслуживания других входящих запросов новые потоки.
2 случай: При асинхронной обработке поток не ждет, пока БД вернет ему данные, а обрабатывает запрос от другого пользователя. Но когда, наконец, с БД придут нужные данные, поток возвращается к обработке ранее обрабатываемого запроса в обычном режиме.

Вопрос: В первом случае, если поток на долго блокируется, IIS создаст второй поток для обслуживания новых запросов (2 потока). Во втором случае тоже создается второй поток Task.Run(() => db.Books);. Если в обоих случаях создаются два потока то в чем разница?
Или пул потоков CLR и пул потоков IIS это два абсолютно разных пула?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.08.2015, 23:17
Ответы с готовыми решениями:

Асинхронные запросы из ASP.NET
кто-нибудь работал с оным? открываю в цикле запросы с неким таймаутом. цикл длинный, но похоже все заканчивается по истечение таймаута у...

асинхронные запросы (одновременное выполнение)
Доброго времени суток. Вопрос следующего характера: я отсылаю на сервер асинхронный запрос, который будет обрабатываться долго (на...

Как отследить асинхронные вызовы
использую вот для асинхронных запросов, добавил юзерконтрол с апдейт панел который обновляет gridview но на странице появляется 2...

10
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
20.08.2015, 00:24
Цитата Сообщение от AsusKV Посмотреть сообщение
В первом случае, если поток на долго блокируется, IIS создаст второй поток для обслуживания новых запросов (2 потока).
не создает, а берет готовый свободный из очереди пула потоков (в этом и суть пула готовых созданых потоков, по сути это смысл любой реализации патерна object pool)

Цитата Сообщение от AsusKV Посмотреть сообщение
Во втором случае тоже создается второй поток Task.Run(() => db.Books);. Если в обоих случаях создаются два потока то в чем разница?
во втором случае рабочий поток остается один, новый не создается, просто когда выполняется операция которая может ждать отклика от другого сервиса (база, сайт) он будет простаивать без дела (если это синхронный контроллер),

вот поэтому и нужен асинхронный контроллер, чтобы в то время когда он ждет отклика от другого сервиса, он выполнял полезную работу, а не простаивал. как только отклик приходит, он возвращается к обработке первоначального запроса.

Добавлено через 1 минуту
Цитата Сообщение от AsusKV Посмотреть сообщение
Или пул потоков CLR и пул потоков IIS это два абсолютно разных пула?
это разные вещи
0
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 13
20.08.2015, 00:53  [ТС]
То есть, если я правильно понял, при асинхронной операции происходит следующее. IIS выделяет поток именно из пула робочих потоков для выполнения action method-а контроллера. Именно этот поток заходит в action method и начинает его выполнение. Когда он доходит до строчки
Code
1
IEnumerable<Book> books = await Task.Run(() => db.Books);
, то поток выделяется уже из пула потоков CLR. При этом поток, который выполнял action method до этой строчки возвращается в пул рабочих потоков IIS и может быть использован для обработки других запросов пользователя. Я все правильно понял? Если да, тогда второй вопрос. Когда чтение из базы выполнится и action method сможет продолжить работу, для его продолжения выделится любой первый доступный поток из пула рабочих потоков IIS?
0
3 / 3 / 1
Регистрация: 30.01.2014
Сообщений: 22
20.08.2015, 16:16
ToListAsync
http://www.codeproject.com/Tip... SP-NET-MVC
0
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 13
17.11.2015, 14:55  [ТС]
Может быть я просто не понимаю чем занимается пул потоков clr, а чем пул потоков iis. Любой метод контроллера выполняет пул потоков слр, а не иис, правильно? Тогда в первом случае выполнением задачи занимается скажем поток номер 3. А во втором ми просто говорим, поток номер 3 нам не нравится, забирайте его обратно и дайте нам какойто другой из пула слр? В чем выгода? Или если этот екшин метод имеет ключевое слово асинк то как то по другому на это реагирует пул потоков иис? Какой тогда workflow?

Добавлено через 12 минут
Пользователь отравляет запрос, http.sys listener его ловит, потом выделяется поток из пула iis? На каком этапе тогда появляется поток из пула clr? Пока clr поток не обработает екшин метод, то поток из пула iis будет ждать ответ? Или в случае если метод с ключевым словом асинк то поток из пула иис не ожидает? Какой поток тогда обработает ответ от слр?
0
3 / 3 / 1
Регистрация: 30.01.2014
Сообщений: 22
17.11.2015, 14:57
Здесь проблема не в потоках, а том что метод не ждет получения ответа от базы и отдает поток сразу. При получении ответа от базы выбирается новый поток и задача продолжается уже в новом потоке с места await .
await по сути это автомат, такой же как и yield
0
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 13
17.11.2015, 16:21  [ТС]
Поток отдается сразу... в этом и мой вопрос, который это поток iis илu clr? Екшин метод выполняется потоком из пула слр. Правильно ли я понимаю, разсудите плз. Пользователь отправляет запрос, хттп.сус драйвер его ловит, выделяется поток из пула потоков иис, потом запускается поток из пула слр и именно он выполняет код екшин метода. В первом случае поток из пула иис ожидает завершение работы потока из пула слр, во втором случае поток из пула слр запускает поток номер два а сам возвращает управление потоку иис, а тот возвращается в пул иис. А когда поток номер два завершит работу то он же продолжит выполнять все что после await а потом отдаст ответ в порт завершения ввода вывода?
0
3 / 3 / 1
Регистрация: 30.01.2014
Сообщений: 22
17.11.2015, 17:44
Пул потоков для CLR отдельно, для натива отдельна. Ты можешь отдельно настроить приложение какой пул IIS будешь использовать. http://metanit.com/sharp/articles/mvc/10.php
0
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 13
18.11.2015, 02:53  [ТС]
Правильно ли я понимаю pipeline?:
- пришел запрос от пользователя, iis выделил поток (назовем поток 1) для обработки запроса
- выделяется поток из пула clr (поток 2), Для обработки кода екшин метода
При синхронном поток 1 ожидает ответ от потока 2.
При асинхронном:
- поток 2 порождает асинхронную операцию, и возвращает управление, поток 1 возвращается в пул потоков iis и может обрабатывать другие запросы.
- когда асинхронная операция вернет результат, достанется поток из пула потоков clr(поток 3), обработает весь код после await, вернет управление
- из пула потоков iis достанется поток 4 который и отправит результат пользователю.

Ссылка на metanit меня еще больше запутала Я не понимаю что делают потоки из пула iis, а что делают потоки из пула clr, кто за что отвечает? На каком этапе поток из пула iis передает работу потоку из пула clr, а когда потом обратно? Какой поток когда возвращает управление? Пожалуйста обьясните
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
18.11.2015, 08:50
это тема веселая, я помню часа три просидел на stackoverflow пытаясь понять в чем смысл )

всё очень просто - в асинхронном поток освобождается и может обрабатывать другие соединения, в этом весь смысл, ибо количество потоков ограниченно

а во вторых Async != отдельный поток
в глубинах винды есть своя специальная асинхронность на уровне прерываний, не помню как называется, неблокирующий или overlapped что-то там
вот короче эта штуковина умеет не блокировать поток, не создавая при этом отдельный поток для некоторых случаев, для файлов точно есть, для сетевых операций тоже, может даже для БД что-то придумали

меня так протроллили на собеседовании однажды, я бил пяткой в грудь что умею в потоки, а спросили как ngnix работая в 1 поток обрабатывает несметные тысячи соединений, вот так и работает(как и другие веб серверы)..
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
18.11.2015, 09:31
Сам не до конца понимаю, интересно стало, видимо ТС имел ввиду такой момент: один IO-поток из пула потоков IIS
принимает конкретный запрос и сплавляет, то есть ставит задачу в очередь задач пула потоков. Тут более менее понятно, в подтверждение http://blogs.msdn.com/b/tmarq/... d-6-0.aspx:
When ASP.NET is hosted on IIS 6.0, the request is handed over to ASP.NET on an IIS I/O thread. ASP.NET immediately posts the request to the CLR ThreadPool and returns HSE_STATUS_PENDING to IIS. This frees up IIS threads, enabling IIS to serve other requests, such as static files. Posting the request to the CLR Threadpool also acts as a queue
То есть, как понял, IIS-потоки выполняют пограничную работу - прием соединения и возвращения результата, причем все это делается драйвером уровня ядра http.sys. Сама же обработка выполняется приложением в пользовательском режиме потоком из пула CLR. И вот тут нюанс непонятный мне, и, видимо, ТС-у тоже:

1. В случае синхронной обработки (без async), метод действия выполняется в потоке пула до его завершения, даже
если в коде идут какие-то долговременные IO-операции (запрос к базе и т.д.).
2. В случае асинхронной обработки из пула потоков берется какой-то свободный поток и в нем начинает выполняться метод. Поскольку метод async, то он сразу возвращает управление, то есть взятый поток снова возвращается в пул, при этом за счет использования Task-ов саму долговременную IO-операцию уже другой поток, причем тоже из пула потоков CLR.
То есть плюс использования асинхронности в том, что потоки пула быстрее освобождаются и ,как следствие, меньше простаивают, и у нас появляется возможность ставить больше задач обработки запросов в единицу времени, хотя сам CLR-пул более интенсивно используется. Так, не?
И все же в таком случае потоки пула могу быстрее закончиться, не? )
И как контраргумент в пользу синхронной обработки: даже если поток пула будет выполнять долговременную IO-операцию, то в случае появления новых запросов с таким же успехом мы просто возьмем еще один поток из пула CLR для обработки, поскольку в этом случае пул не так интенсивно используется, и он там сто пудово будет.
pS: надо будет прошерстить всю эту тему
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2015, 09:31
Помогаю со студенческими работами здесь

Так куда все таки внедрять EF DbContex (или репозитории)? в контроллеры или в модели представления?
Всем привет! Прочитал кучу информации о подходе MVС в разработке пользовательских приложений и так пока и не смог понять одну вещь...

Асинхронные методы контроллера. Использует ли ASP.net приложение "свой" пул потоков?
Здравствуйте вникаю в TPL, в частности интересуют асинхронные экшены в контроллере. В ASP.net MVC/ WEB API для обработки каждого запроса...

Контроллеры
В общем у меня такая проблема. Контроллер TREI серии ECO. Не получается сохранить программу в ПЗУ. Сохраняет в ОЗУ. Как залить программу в...

С/С++ и контроллеры
Добрый день. Вот хотел поинтересоваться имеется ли какая нибудь хорошая литература по программированию контроллеров ? и какой язык...

Контроллеры шины
https://www.cyberforum.ru/attachment.php?attachmentid=336512&amp;stc=1&amp;d=1386070827 Я не помню, как я установил драйверы в прошлый раз, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru