Насколько я понимаю, это замена веб-форм '1001 * в мире MVC, чтобы гарантировать, что поток, обрабатывающий запрос, будет ожидать завершения всех асинхронных операций, прежде чем вернуться.Рассмотрим следующий код:
public ViewResult Index() {
Task.Factory.StartNew(() => { // web service call here
});
return View();
}
Index()
работает в основном потоке (запрос http).StartNew()
будет извлекать поток из ThreadPool
, который запускает на нем делегат вызова веб-службы, и немедленно возвращается в основной поток.Основной поток немедленно возвращает (представление) и заканчивает обработку запроса (где-то в стеке во время выполнения ASP.NET).Но второй поток все еще работает (скорее всего, ожидает завершения ввода-вывода), но это не имеет смысла - никто не ждет, пока он потребит свой результат.формы.Он хранит внутренний счетчик всех ожидающих асинхронных вызовов и ждет всех из них, прежде чем вернуться из основного потока (т. Е. Счетчик уменьшается до нуля).AsyncManager
делает то же самое, но вы увеличиваете / уменьшаете счетчик вручную.Если вам интересна концепция SynchronizationContext (это не так просто понять), я бы порекомендовал серию статей Майка Переца . Этот также будет очень полезен.