Ken*_*eth 15

asp.net中的异步/等待不是关于并发性,而是关于阻塞或不阻塞线程.

如果使用async/await,则在等待操作时释放线程.如果此操作受CPU约束,则没有任何好处(由于上下文切换,它甚至会稍微慢一些)

如果操作是IO绑定的(网络,磁盘,...),则意味着IIS可以处理更多并发请求,因为您没有阻止任何无效的线程.

  • 没有'无限'这样的东西.每个线程占用大量资源.除非您拥有无限的资源,否则您没有无限的线程. (4认同)

Ste*_*ary 12

正如其他人所指出的那样,async允许请求线程在进行异步操作时返回线程池.使用同步处理程序,您的服务器将最终在I/O上阻塞线程,基本上没有重要的事情,但在被阻止时也无法用于其他请求.async只需释放这些线程,使它们始终有用.

所以,首先要注意的是问题" async 线程池"是错误的问题.当您使用时async,您允许ASP.NET最大限度地利用现有的线程池.async采用ASP.NET中现有的(并行)并发性并添加(异步)并发性以实现更高的可伸缩性.

但问题仍然是"为什么"?原因有两个:async可以比(仅)线程池进一步扩展,并且async响应更快.正如在其他答案的评论中提到的,线程是非常重量级的对象,不必要地浪费; 异步操作的内存远小于线程使用的内存.第二个原因也很重要:当突然发出请求时,线程池(自身)只能以有限的速率扩展; async使线程池能够更有效地处理突发请求.