想象一下,我们有一个调用存储过程的aspx网页,15分钟后在GridView上呈现数据表。在我的假设中,我没有运行,比如,4 asych可能并行发生 - 只是一个长数据库过程。
在调用堆栈的至少3个位置,Microsoft让我尝试以异步方式执行操作,使用异步页面和Web方法,异步ADO.NET调用以及异步关键字和异步委托等操作。
例如:
[WebMethod]
public IAsyncResult BeginLengthyProcedure( AsyncCallback cb, object s) {...}
[WebMethod]
public string EndLengthyProcedure(IAsyncResult call) {...}
(参考http://msdn.microsoft.com/en-us/library/aa480516.aspx)
我的心理模型是,IIS只能同时处理许多“事物(线程?)”处理请求,如果使用异步技术,页面将不会耗尽可用于接收请求的线程池。我认为,当async方法正在运行时,它会消耗操作系统线程,并且可能仍然可以通过活动来破坏服务器,但是IIS会认为它不需要计算它将处理的最大请求数。因此应用程序仍然响应。
In the comments on this question here,我对是否以及使用异步保存了哪些资源感到困惑。我从讨论中得到的印象是没有关键字“asynch”的技术将保存任何带有关键字“thread”或“resource”的资源。可能是有一些资源被释放用于其他请求,也许我只是没有它的名字?
B部分。 这个限制是什么,它是如此之高,以至于每毫秒只有强烈的100次请求才能达到它,或者它是否足够低以至于每个运行同步15分钟页面的几十个用户都可以达到这个限制?
答案 0 :(得分:1)
Lucian Wischik是.NET Async的规范负责人之一,他使用服务员的类比(在一家餐馆)描述了异步编程。
“服务员的工作就是在餐桌上等待,直到顾客吃完饭。如果你想同时服务两张桌子,你必须雇用两名服务员。” 那不是真的,是吗?为什么?因为你不需要两个服务员!您可以使用相同的服务员,并在表之间共享他。
因此,您可以让主线程在请求上添加一些书签,这需要花费很长时间,而不是将新线程(价格昂贵)旋转起来。这类似于允许主要服务员检查其他桌子,而他们服务的第一张桌子正在忙着选择要订购或吃的东西。
现在,如果长时间运行的进程是您的代码正在执行的操作,就像处理项目列表一样,异步不会为您节省任何东西。 (我想这就是修剪草坪的类比,在这种情况下你需要两台割草机同时修剪两个草坪。)只有在你的代码等待资源可用或要求完成时,异步才有用。作为要建立的互联网连接或返回结果的查询。它为您节省了与多线程相关的费用和复杂性。
对于那些对上述链接中的异步编程知之甚少或根本不了解的人,Lucian为这个主题提供了很好的讨论。虽然他的演讲主要关注.NET语言所应用的异步,但理论一般都延伸到异步编程。