想象一下这个动作:
public async Task<ActionResult> MyAction(){
var result = await MyMethodAsync();
return View(result);
}
我理解通过使操作异步,您可以在执行MyMethodAsync()
时将执行操作的线程释放回线程池,以便它可以用于提供其他HTTP请求。
现在我想知道:那么什么线程执行MyMethodAsync()
?我猜测它不是线程池中的另一个线程,因为这会破坏异步操作的目的。它只是在HTTP响应完成时创建,启动和销毁的全新线程吗?
答案 0 :(得分:3)
不,它仍然来自线程池,并没有打败任何目的。
Async在阻塞操作期间变得很有价值,比如访问磁盘或网络,任何非cpu绑定的东西(即I / O(输入/输出)绑定的操作)。
该线程仅返回到池中,因此它不必等待阻塞操作完成,然后才能帮助处理另一个HTTP请求。
阻止操作完成后,另一个工作线程将从池中获取。
这可以帮助抵消称为线程池饥饿的东西。每个线程池只会旋转很多线程,而且旋转更多是很昂贵的。有时,Web服务器可以与许多线程捆绑在一起等待阻塞操作完成,因此新请求必须等待新线程,这意味着他们必须等待其他人的阻塞操作。使用async,可以将正在等待阻塞操作的线程返回到池中,以便它可以为其他(可能是CPU绑定的)请求提供服务。
阅读本文:http://msdn.microsoft.com/en-us/library/ee728598(VS.100).aspx
...然后阅读:http://blog.stephencleary.com/2013/11/there-is-no-thread.html
我知道另一个线程一旦从池中被抓住了 阻止操作已经完成,但我不知道的是什么 线程执行阻塞操作本身。
没有线程执行阻塞操作。 CPU正在等待另一台设备(如网卡或磁盘控制器)返回输出。
线程是CPU绑定的工件,RAM也是如此,因为它根据CPU时钟速率在总线上运行。机器中还有其他设备,如USB,网卡,磁盘等。这些其他设备受I / O限制,因为它们是输入/输出设备。