gpt4 book ai didi

asp.net-mvc - 工作线程从哪里来的异步 MVC 操作?

转载 作者:行者123 更新时间:2023-12-03 12:55:41 25 4
gpt4 key购买 nike

想象一下这个 Action :

public async Task<ActionResult> MyAction(){
var result = await MyMethodAsync();
return View(result);
}

我知道通过使操作异步,您将执行操作的线程释放回线程池,而 MyMethodAsync()执行,以便它可以用于服务其他 HTTP 请求。

现在我想知道:那么什么线程执行 MyMethodAsync() ?我猜它不是线程池中的另一个线程,因为这会破坏异步操作的目的。它只是一个在 HTTP 响应完成时创建、启动和销毁的全新线程吗?

最佳答案

不,它仍然来自线程池,并且不会破坏任何目的。

异步在阻塞操作期间变得很有值(value),例如访问磁盘或网络,任何不受 cpu 限制的东西(即,受 I/O(输入/输出)限制的操作)。

线程只返回到池中,这样它就不必等待阻塞操作完成就可以帮助服务另一个 HTTP 请求。

一旦阻塞操作完成,另一个工作线程被抓取 来自游泳池 .

这可以帮助抵消称为线程池饥饿的问题。每个线程池只启动这么多线程,并且启动更多线程是昂贵的。有时,Web 服务器可能会与许多等待阻塞操作完成的线程捆绑在一起,因此新请求必须等待新线程,这意味着它们必须等待其他人的阻塞操作。使用异步,等待阻塞操作的线程可以返回到池中,以便它可以服务其他(可能是 CPU 绑定(bind)的)请求。

阅读:http://msdn.microsoft.com/en-us/library/ee728598(VS.100).aspx

...然后阅读:http://blog.stephencleary.com/2013/11/there-is-no-thread.html

I understand that another thread is grabbed from the pool once the blocking operation is done, but what I don't know is exactly what thread executes the blocking operation itself.



没有线程执行阻塞操作。 CPU 正在等待另一个设备(如网卡或磁盘 Controller )返回输出。

线程是 CPU 绑定(bind)的工件,RAM 也是如此,因为它根据 CPU 时钟速率在总线上运行。机器中还有其他设备,如 USB、网卡、磁盘等。这些其他设备是 I/O 绑定(bind)的,因为它们是输入/输出设备。

关于asp.net-mvc - 工作线程从哪里来的异步 MVC 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26519595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com