(Возможно, это дублирует вопрос ASP.NET MVC4 Async controller - Why to use?, но про webapi, и я не согласен с ответами там)Асинхронные методы ApiController - какая прибыль? Когда использовать?
Предположим, у меня длинный SQL-запрос. Его данные должны быть сериализованы в JSON и отправлены в браузер (в качестве ответа на запрос xhr). Пример кода:
public class DataController : ApiController
{
public Task<Data> Get()
{
return LoadDataAsync(); // Load data asynchronously?
}
}
Что на самом деле происходит, когда я делаю $ .getJSON ('API/данные', ...) (см этот плакат http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster.pdf):
- [IIS] Запрос принимается IIS.
- [IIS] IIS ждет один поток [THREAD] из управляемого пула (http://msdn.microsoft.com/en-us/library/0ka9477y(v=vs.110).aspx) и начинает работать в нем.
- [THREAD] Webapi Создает новый объект DataController в этом потоке и других классах.
- [НИТИ] Использует задачи параллельный LIB для запуска SQL-запрос в [thread2]
- [НИТИ] восходит к управляемому пула, готовы к другой обработке
- [thread2] работает с SQL драйвера, считывает данные как он готов и вызывает [THREAD3] для ответа на запрос xhr.
- [THREAD3] отправляет ответ.
Пожалуйста, не стесняйтесь поправить меня, если что-то не так.
В приведенном выше вопросе, они говорят, точка и прибыль, что [thread2] не из управляемого пула, однако MSDN статья (ссылка выше) говорит, что
По умолчанию, параллельные типов библиотек например,
Task
иTask<TResult>
использовать потоки потоков для запуска задач.
Поэтому я делаю вывод, что все ТРЕХ РЕЗЬБЫ из управляемого пула.
Кроме того, если бы я использовал синхронный метод, я бы все же оставил свой сервер отзывчивым, используя только один поток (из пула драгоценных потоков).
Итак, какова фактическая точка обмена от 1 потока до 3 потоков? Почему бы не просто увеличить потоки в пуле потоков?
Есть ли очевидные полезные способы использования асинхронных контроллеров?
«Когда результат поступает с SQL-сервера, поток пула потоков считывает ответ» - можете ли вы подробнее остановиться на этом? Где результат? Кто вызывает поток из threadpool? –
Предполагая, что ваше SQL-соединение использует TCP/IP, результат поступает в виде сетевого пакета. Это вызывает прерывание, когда драйвер устройства считывает пакет и передает его в пользовательский режим. Механизм IOCP уведомляет пул потоков о том, что чтение сокета завершено, и оно обеспечит завершение ответа, проанализирует его и затем сообщит, что запрос готов к продолжению. (Это * все еще * слегка упрощено). –
Меня особенно интересует «уведомляет пул потоков, который ...» AFAIK, когда что-то можно уведомить - он либо ожидает, либо уведомляет, либо периодически проверяет _notification queue_. Я делаю вывод, что для выполнения этих операций имеется выделенный выделенный поток 1+. Это верно? Должны ли мы считать в этом потоке ресурс «wasted-as-as-aync»? –