我只是想知道,如果我有一个ASP.net Web应用程序,无论是WebForms还是MVC,是否有任何情况下异步进行操作会有意义?
Web服务器已经为我处理线程,因为它会旋转多个线程来处理请求,而且大多数请求处理都非常简单直接。
我看到一些用途,当真正的东西是a)昂贵的和b)可以并行化。但这些是少数情况(至少从我遇到的情况来看)。
在简单的“读取一些输入,做一些CRUD,显示一些输出”场景中是否有来自async的任何增益?
答案 0 :(得分:4)
如果页面在每个请求上向外部Web服务发出请求,则使用异步BCL API从Web服务获取数据将有助于释放服务器上的资源。这是因为Windows可以区分等待东西(异步Web服务调用)的托管ASP线程和做东西的托管ASP线程(同步Web)服务电话)。这些异步调用可能最终成为幕后的I / O完成端口,从而将ASP从基本上所有的负担中解放出来。这可以使网站能够处理更多的同时请求。 具体来说,当ASP线程正在等待异步操作的回调时,ASP可能会决定在此期间重用该线程来提供其他请求。
调用外部资源的同步BCL方式是Get()
,Read()
,EndRead()
等方法系列。他们的异步对应方法是BeginGet()
,EndGet()
,BeginRead()
,EndRead()
等方法系列。
如果您有一个同时执行两项操作的页面,并且两者基本上都是等待外部数据类型操作,那么异步BCL API将自动启用并行操作。如果他们计算pi 类型的操作,那么您可能想要使用parallell BCL API。
答案 1 :(得分:2)
这是一个例子,当您明显从异步调用中获益时:想象一下,为了呈现页面,您需要聚合来自不同Web服务(或数据库调用)的信息,其中每个Web服务都是独立的,从而导致网络调用。在这种情况下,异步模式非常好,因为您具有IO绑定操作,将使用IO完成端口,并且在等待响应时您不会独占工作线程。当操作正在运行时,服务器端不会消耗任何线程。
如果您有许多CPU绑定操作,那么异步模式不会带来太多好处,因为当您释放请求工作线程执行操作时,将使用另一个线程来进行计算。
我发现this article是一个非常有用的参考。