(Вероятно, это дублирует вопрос ASP.NET MVC4 Async controller - зачем использовать?, но про webapi, и я не согласен с ответами там)
Предположим, что у меня длинный SQL-запрос. Его данные должны быть сериализованы в JSON и отправлены в браузер (в качестве ответа на запрос xhr). Пример кода:
public class DataController : ApiController
{
public Task<Data> Get()
{
return LoadDataAsync(); // Load data asynchronously?
}
}
Что на самом деле происходит, когда я делаю $.getJson('api/data',...) (см. этот плакат 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 в этом потоке и других классах.
- [THREAD] Использует task-parallel lib для запуска sql-запроса в [THREAD2]
- [THREAD] возвращается в управляемый пул, готовый к другой обработке.
- [THREAD2] работает с драйвером sql, считывает данные по мере готовности и вызывает [THREAD3] для ответа на запрос xhr
- [THREAD3] отправляет ответ.
Пожалуйста, не стесняйтесь исправлять меня, если что-то не так.
В вышеприведенном вопросе говорится, что смысл и прибыль в том, что [THREAD2] не принадлежит Управляемому пулу, однако статья MSDN (ссылка выше) говорит, что
По умолчанию параллельные типы библиотек, такие как
Task
иTask<TResult>
, используют потоки пулов потоков для запуска задач.
Итак, я делаю вывод, что все три РЕЗЬБЫ из управляемого пула.
Кроме того, если бы я использовал синхронный метод, я все равно оставил бы свой сервер отзывчивым, используя только один поток (из пула драгоценных потоков).
Итак, какова фактическая точка переключения из 1 потока в 3 потока? Почему бы не просто увеличить потоки в пуле потоков?
Есть ли явно полезные способы использования асинхронных контроллеров?