问完这个问题后,我在使用异步时感觉很舒服 ASP.NET MVC中的操作.因此,我就此写了两篇博客文章:
我对ASP上的异步操作有太多误解.NET MVC.
我总是听到这句话:Application can scale better if operations run asynchronously
我也经常听到这样的句子:if you have a huge volume of traffic, you may be better off not performing your queries asynchronously - consuming 2 extra threads to service one request takes resources away from other incoming requests.
我认为这两句话前后矛盾.
我没有太多关于threadpool如何在ASP上工作的信息.NET但我知道线程池的线程大小有限.所以,第二句话必须与这个问题有关.
我想知道ASP中是否存在异步操作.NET MVC使用的线程来自上的ThreadPool.网络4?
例如,当我们实现AsyncController时,应用程序是如何构造的?如果我获得了巨大的流量,实现AsyncController是个好主意吗?
有没有人能在我眼前把这个黑幕拉开,向我解释ASP上的异步协议.网络MVC 3(网络4)?
Edit:个个
我已经阅读了以下文件近数百次,我理解主要交易,但我仍然感到困惑,因为有太多不一致的 comments .
Using an Asynchronous Controller in ASP.NET MVC
Edit:个个
假设我有如下控制器操作(但不是AsyncController
的实现):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
正如你在这里看到的,我发动了一次行动,却忘了它.然后,我立即返回,不必等待它完成.
在这种情况下,是否必须使用线程池中的线程?如果是这样,那么在它完成之后,该线程会发生什么情况呢?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
}
}