После этого вопроса мне удобно при использовании асинхронных операций в ASP.NET MVC. Итак, я написал два сообщения в блоге об этом:
У меня слишком много недоразумений по поводу асинхронных операций в ASP.NET MVC.
Я всегда слышу это предложение: приложение может масштабироваться лучше, если операции выполняются асинхронно
И я тоже много слышал такого рода предложения: если у вас огромный объем трафика, вам может быть лучше не выполнять ваши запросы асинхронно - использование 2 дополнительных потоков для обслуживания одного запроса отнимает ресурсы у других входящих запросов.
Я думаю, что эти два предложения противоречивы.
У меня мало информации о том, как работает пул потоков в ASP.NET, но я знаю, что пул потоков имеет ограниченный размер для потоков. Итак, второе предложение должно быть связано с этим вопросом.
И я хотел бы знать, если асинхронные операции в ASP.NET MVC использует поток из ThreadPool на .NET 4?
Например, когда мы реализуем AsyncController, как работает структура приложения? Если я получаю огромный трафик, это хорошая идея для реализации AsyncController?
Есть ли кто-нибудь, кто может убрать этот черный занавес перед моими глазами и объяснить мне, что такое асинхронность в ASP.NET MVC 3 (NET 4)?
Редактировать:
Я прочитал этот документ почти сотни раз, и я понимаю основную сделку, но все же у меня возникает путаница, потому что слишком много противоречивых комментариев.
Использование асинхронного контроллера в ASP.NET MVC
Редактировать:
Давайте предположим, что у меня есть действие контроллера, как показано ниже (не реализация, AsyncController
хотя):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
Как вы видите здесь, я запускаю операцию и забываю об этом. Затем я возвращаюсь немедленно, не дожидаясь его завершения.
В этом случае нужно ли использовать поток из пула потоков? Если так, после того, как это завершится, что случится с этим потоком? Имеет ли GC
приходит и убирать только после его завершения?
Редактировать:
Для ответа @ Darin, вот пример асинхронного кода, который обращается к базе данных:
public class FooController : AsyncController {
//EF 4.2 DbContext instance
MyContext _context = new MyContext();
public void IndexAsync() {
AsyncManager.OutstandingOperations.Increment(3);
Task<IEnumerable<Foo>>.Factory.StartNew(() => {
return
_context.Foos;
}).ContinueWith(t => {
AsyncManager.Parameters["foos"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<Bars>>.Factory.StartNew(() => {
return
_context.Bars;
}).ContinueWith(t => {
AsyncManager.Parameters["bars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<FooBar>>.Factory.StartNew(() => {
return
_context.FooBars;
}).ContinueWith(t => {
AsyncManager.Parameters["foobars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
}
public ViewResult IndexCompleted(
IEnumerable<Foo> foos,
IEnumerable<Bar> bars,
IEnumerable<FooBar> foobars) {
//Do the regular stuff and return
}
}