Async已成为.net中的流行语,MS已在Web API 2中引入它,以便可以处理更多请求,而其他请求则等待IO完成。
虽然我可以看到这样做的好处,但这真的是一个问题吗? x64架构在线程池中有30000多个线程,所以除非您的网站上有很多并发用户真的需要异步?即使你有很多没有缓存的并发用户,我也很确定SQL Server会因为那么多请求而崩溃?
除了真正需要在Web框架上进行异步路由之外它还有光泽吗?
答案 0 :(得分:9)
此处的许多其他答案都来自UI(桌面/移动应用)视角,而非Web服务器视角。
.NET 4.5 / VS 2012中引入了Async已成为.net中的流行词,MS已在Web API 2中引入它,以便可以处理更多请求,而其他请求则等待IO完成。
async
和await
。但是,很久以前,ASP.NET自.NET 2.0以来就具有异步请求功能。并且有人使用它。
async
和await
带来的是易于维护的异步代码 。
虽然我可以看到这样做的好处,但它真的是一个问题吗?
async
在服务器上的主要优点是可扩展性。简而言之,async
任务比线程更好地扩展。
async
请求实际上只需要几百个字节。
还有一些需要考虑的问题。 .NET线程池具有有限的注入速率,因此除非您将minWorkerThread
计数设置为远高于通常需要的值,否则当您获得突发流量时,一些请求将会在.NET启动之前达到503线程来处理它们。 async
使您的线程保持自由(尽可能多),以便更好地处理突发流量。
当@Joshua指出您可能正在考虑请求队列限制(IIS队列默认为1000而ASP.NET请求限制为5000)时,@ Joshua再次正确。重要的是要注意,一旦填充此队列(在突发流量期间),新请求将被503拒绝。x64架构在线程池中有30000多个线程,所以除非你的网站上有那么多并发用户真的需要异步吗?
即使你有很多没有缓存的并发用户,我也很确定SQL Server会因为那么多请求而崩溃?
啊,现在完全是另一个问题。
我在async
服务器上专门提供talk at ThatConference 2013。谈话的一部分是async
没有帮助的情况(my Twitter update)。
有一个excellent blog post here,它取得了异步数据库调用不值得努力的地位。重要的是要注意这篇文章中的假设:
async
,越来越多的库提供异步API(例如,实体框架)。 async
服务器真正发挥作用的地方是你的后端也可以扩展。例如,一个Web服务,Azure SQL,NoSQL集群等。示例:我正在编写一个MVC / WebAPI服务器,它使用Azure SQL和Storage作为其后端(出于所有实际目的,我可以表现得像它们具有无限的可伸缩性);在那种情况下,我将创建我的服务器async
。在这种情况下,您可以使用async
将服务器扩展10倍或更多。
但是如果您只有一个SQL Server后端(并且没有计划更改为Azure SQL),那么制作您的Web服务器async
是没有意义的,因为您无论如何都受到后端的限制。 / p>
答案 1 :(得分:4)
答案 2 :(得分:1)
你从哪里得到30000。我不记得确切,但我认为Asp.net使用12 x核心线程。
答案 3 :(得分:0)
我必须使用异步,当操作时间过长(上传,导出,处理)时,用户必须知道进度。
答案 4 :(得分:-2)
在以下场景中需要异步
1)当您执行非常长的操作并且您不想冻结UI时。
2)当你设计一些需要在后台完成的任务时。
例如,您正在从数据库渲染图像。但是你不希望你的页面在那时被冻结,因为异步非常有帮助。