C# · 12月 30, 2021

c# – 什么时候真的需要在Web框架上异步?

Async已经成为.net和MS中的一个流行语,并将其引入到Web API 2中,以便在其他人等待IO完成时可以处理更多的请求.

虽然我可以看到这个的好处,真的是一个问题吗? X64架构在线程池中有30000个线程,除非您的网站上有许多并发用户是异步真正需要的?即使你有这么多并发用户没有缓存,我相当肯定sql Server将会崩溃与许多请求?

除了真正需要在Web框架上进行异步路由外,它还是有光泽的吗?

解决方法 这里的许多其他答案来自UI(桌面/移动应用)的角度,而不是Web服务器的观点.

Async has become a buzzword in .net and MS have introduced it in Web API 2 so that more requests can be handled whilst others are waiting on IO to finish.

在.NET 4.5 / VS 2012中引入了异步和等待.然而,ASP.NET自.NET 2.0以来已经有异步请求功能 – 很久以前.人们一直在使用它.

什么异步和等待带给表是易于维护的异步代码.

Whilst I can see the benefit of this,is it really a concern?

服务器异步的主要优点是可扩展性.简单地说,异步任务比线程更好.

@约书亚的评论是记忆的关键;一个线程需要大量的内存(不要忘记无法分页的内核模式堆栈),而异步请求字面上只需要几百个字节.

还有爆发的考虑. .NET线程池具有有限的注入速率,因此除非您将minWorkerThread计数设置为远高于通常需要的值,否则当您获得一个流量时,一些请求将在503之前发生,而.NET可以启动足够的线程来处理它们.异步使您的线程免费(尽可能多),以便更好地处理突发流量.

A x64 architecture has 30000+ threads in the Thread Pool so unless you have that many concurrent users on your website is async really required?

@Joshua再次正确地指出,您可能会想到一个请求队列限制(IIS队列默认为1000,ASP.NET请求限制为5000).重要的是要注意,一旦这个队列被填满(在突发流量期间),新的请求将被拒绝503.

Even if you have that many concurrent users without caching I’m pretty sure sql Server will fall over with that many requests?

啊,现在完全是另一个问题.

我正在给异步服务器一个talk at ThatConference 2013.这个谈话的一部分是异步无助的情况(my Twitter update).

有一个excellent blog post here采取的立场,异步db调用是不值得的努力.注意这篇文章中的假设很重要:

>在撰写这篇文章的时候,异步Web服务器很难.这些天我们有异步,​​越来越多的图书馆正在提供异步API(例如,实体框架).
>该体系结构假定单个Web服务器具有单个sql Server后端.这是传统上非常普遍的设置,但是今天很快就会改变.

当异步服务器真正发光的时候,当你的后端也可以扩展.例如,一个Web服务,Azure sql,Nosql集群等.例如:我正在编写一个使用Azure sql和Storage作为其后端的MVC / WebAPI服务器(对于所有实际的目的,我可以像他们具有无限的可扩展性);在这种情况下,我将使我的服务器异步.在这种情况下,您可以使用异步方式将服务器扩展到10x或更大.

但是,如果您只有一个sql Server后端(并且没有计划更改为Azure sql),那么无论如何,由于您的后端受到限制,因此无法使您的Web服务器异步.