在这个问题后,在ASP.NET MVC中使用异步 操作时,我感到很舒服。所以,我写了两个博客文章:在ASP.NET MVC中使用ThreadPool中的异步操作4
我有我的心意,想在ASP.NET MVC的异步操作太多的误解。
我总是听到这样一句话:应用可以扩展更好,如果操作运行异步
而且听说这种句子很多,以及:如果你有交通量巨大,你可能最好不要异步执行查询 - 消耗2个额外的线程来处理一个请求,这会将资源从其他传入的请求中分离出来。
我认为这两句话是不一致的。
我没有关于线程池如何在ASP.NET上工作的很多信息,但我知道线程池的线程大小是有限的。所以,第二句话必须与这个问题有关。
我想知道ASP.NET MVC中的异步操作是否使用.NET 4上的ThreadPool的线程?
例如,当我们实现一个AsyncController时,应用程序结构如何?如果我的流量很大,实施AsyncController是个好主意吗?
有没有人可以把这个黑色的窗帘放在我眼前,并向我解释有关ASP.NET MVC 3(NET 4)上的异步处理?
编辑:
我已阅读本文件下方近数百次,我理解主要交易,但我仍然有困惑,因为有太多的不一致意见那里。
Using an Asynchronous Controller in 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
}
}
不知道答案,但其值得注意的异步和多线程是不同的东西。所以有可能拥有固定数量的异步处理线程。会发生什么情况是当一个页面必须阻止I/O时,另一个页面才有机会在同一个线程上运行。这两种语句如何可以是真实的,异步可以使事情变得更快,但太多的线程是一个问题。 – 2012-01-05 13:23:50
@ChrisChilvers是的,在异步操作中,多线程并不总是必需的。据我所知,我已经想到了,但我认为我没有任何控制者。 AsyncController从我的角度旋转它想要的线程数量,但不确定。在WPF等桌面应用程序中是否还有线程池的概念?我认为线程的数量不是这些类型的应用程序的问题。 – tugberk 2012-01-05 13:28:25
看看视频[杰夫里氏超线程(http://channel9.msdn.com/Shows/AppFabric-tv/AppFabrictv-Threading-with-Jeff-Richter) – oleksii 2012-01-05 13:32:38