【发布时间】:2010-11-04 16:27:57
【问题描述】:
在异步编程模型中编写代码(更具体地说 - 使用回调而不是阻塞线程)的主要目的之一是尽量减少系统中阻塞线程的数量。
对于运行线程,这个目标是显而易见的,因为上下文切换和同步成本。
但是阻塞的线程呢?为什么减少他们的数量如此重要?
例如,当等待来自网络服务器的响应时,线程被阻塞,不占用任何 CPU 时间,也不参与任何上下文切换。
所以我的问题是: 除了 RAM(每个线程大约 1MB?)阻塞的线程还占用了哪些其他资源?
还有一个更主观的问题: 在什么情况下,这样的成本才能真正证明编写异步代码的麻烦是合理的(例如,代价可能是将你好的连贯方法拆分为许多 beginXXX 和 EndXXX 方法,并将参数和局部变量移动为类字段)。
更新 - 我没有提及或没有给予足够重视的其他原因:
更多线程意味着更多地锁定公共资源
更多的线程意味着更多的线程创建和处理,这是昂贵的
系统肯定会耗尽线程/RAM,然后停止为客户端提供服务(在 Web 服务器场景中,这实际上会导致服务中断)
【问题讨论】:
-
Quibble:答案可能取决于上下文。例如,IIS 工作线程是一种有限的商品,而操作系统线程则不那么重要。细节会很有帮助。
-
我从来没有听说过最小化现有线程的数量是异步代码的目的。根据定义,异步代码依赖于比同步(单线程!)代码更多的线程。
-
@Harper: Disagree.
-
顺便说一下,IIS 线程默认只有 256Kb 的堆栈,而不是默认的 1Meg。
-
@Craig Stuntz:我的主要观点是,限制使用的线程数并不是使用异步方法的原因。
标签: c# .net multithreading asynchronous