Как именно AsyncController
избегает использования рабочего потока ASP.NET?Если я использую шаблон на основе событий (псевдокод):
[AsyncTimeout(60000)]
public void WaitForWakeUp()
{
AsyncManager.OutstandingOperations.Increase();
EventRaisedElsewhere +=
state =>
{
AsyncManager.OutstandingOperations.Decrease();
return Content("Woke up because of " + state);
};
}
... тогда согласно Clay Lenharts он не использует рабочий поток ASP.NET.Как это возможно?
Я немного заглянул в исходный код AsyncController
, но ничего не понял, за исключением того, что он использует IAsyncResult
много и в некоторых местах QueueUserWorkItem
.
Но как BeginInvoke
и QueueUserWorkItem
не могут использовать рабочий поток ASP.NET?Конечно, оба из них используют поток пула потоков, и, конечно, в рабочем процессе ASP.NET есть только один пул потоков?
Согласно MSDN,
Веб-сервер получаетпоток из пула потоков (рабочий поток) и планирует его для обработки входящего запроса.Этот рабочий поток инициирует асинхронную операцию .
Рабочий поток возвращается в пул потоков для обслуживания другого веб-запроса.
Когда асинхронная операция завершена, он уведомляет об этомASP.NET.
Но для чего-то нетривиального это звучит так: инициирует асинхронную операцию по-прежнему требует выполнения потока.Только в очень простых случаях (например, при использовании BCL для загрузки веб-контента) он будет полностью размотан и / или полностью привязан к IOCP, верно?
Я спрашиваю частично, потому что вижу все эти серверы чата, реализованные с использованием AsyncController
и если все, что они делают - это «ждут новых сообщений», я не понимаю, как это можно сделать в потоке, не являющемся пулом.