【发布时间】:2016-12-16 06:17:26
【问题描述】:
我的问题不仅适用于 C# 和 Asp.net,但我更容易提出更具体的问题。
当一个 Asp.net 请求等待异步 IO 操作时,线程基本上会进入线程池以供其他请求重用。为什么这比在 IO 操作完成之前让线程休眠更有效?毕竟,当线程返回到线程池时,它的堆栈需要保存在内存中才能完成最初的请求。我的假设是我们不能重用分配给线程的内存,除非我们将使用过的堆栈内存复制到其他地方,并且复制数据可能会引入额外的开销,这可能是不合理的。
我错过了什么吗?我的假设错了吗?请解释一下。
编辑: jlew 指出的答案缺少一点。当线程返回池中时,请求使用的堆栈内存会发生什么变化?如果我们不能重用内存,那么重用线程有什么意义呢?如果我们想重用堆栈中未使用的部分,那么我们将不得不移动一些内存。如果是这样,移动内存和重用未使用的堆栈内存是否会提高整体效率?
【问题讨论】:
-
如果您严格查看单个操作,则效率并不高。如果您正在查看一个使用许多线程的应用程序,例如 Web 应用程序,其中需要线程,尤其是在负载较高的情况下,那么它总体上会变得高效,因为现在可以释放服务于 I/O 绑定请求的线程来服务其他线程在 I/O 完成时请求。
-
Thread.Sleep 是一个阻塞调用。除非您正在测试一些冗长的操作,否则不要使用它。 stackoverflow.com/questions/8815895/…
-
我知道等待 I/O 操作完成的线程可以被释放和重用。我想知道真正的好处是什么。堆栈到哪里去了?是复制还是为后续请求分配了新堆栈?为什么不只是增加线程池中的线程数?除了堆栈内存之外,线程是否会引入任何重大开销?
-
@Vakho 查看来自 jlew 的链接。应该足以回答您的问题。
标签: c# asp.net async-await