После этого вопроса мне становится удобно при использовании async операций в ASP.NET MVC. Итак, я написал два сообщения в блоге:
У меня слишком много недоразумений в моей голове об асинхронных операциях над ASP.NET MVC.
Я всегда слышу это предложение: Приложение может масштабироваться лучше, если операции выполняются асинхронно
И я также слышал такие предложения: , если у вас огромный объем трафика, вам может быть лучше не выполнять ваши запросы асинхронно - потребление 2 дополнительных потоков для обслуживания одного запроса отвлекает ресурсы от другие входящие запросы.
Я думаю, что эти два предложения непоследовательны.
У меня мало информации о том, как работает threadpool на ASP.NET, но я знаю, что threadpool имеет ограниченный размер для потоков. Таким образом, второе предложение должно быть связано с этой проблемой.
И я хотел бы знать, работают ли асинхронные операции в ASP.NET MVC с потоком ThreadPool на .NET 4?
Например, когда мы реализуем AsyncController, как структура приложения? Если я получаю огромный трафик, неплохо ли реализовать AsyncController?
Есть ли кто-нибудь, кто может забрать этот черный занавес перед моими глазами и объяснить мне сделку об асинхронности на ASP.NET MVC 3 (NET 4)?
Edit:
Я прочитал этот ниже документ почти сотни раз, и я понимаю основную сделку, но все же у меня путаница, потому что там слишком много непоследовательных комментариев.
Использование асинхронного контроллера в ASP.NET MVC
Edit:
Предположим, что у меня есть действие контроллера, как показано ниже (не реализация AsyncController
хотя):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
Как вы видите здесь, я запускаю операцию и забываю об этом. Затем я возвращаюсь немедленно, не дожидаясь завершения.
В этом случае нужно ли использовать поток из threadpool? Если это так, после того, как оно завершается, что происходит с этим потоком? Входит ли GC
и очищается сразу после его завершения?
Edit:
Для ответа @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
}
}