0

假设我们有一个调用存储过程的 aspx 网页,15 分钟后在 GridView 上呈现数据表。在我的假设中,我没有运行可能并行发生的 4 个 asych——只是一个长的数据库过程。

在调用堆栈上至少有 3 个地方,微软让我尝试以异步方式做事,包括异步页面和 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 一次只能有这么多“事物(线程?)”来处理请求,并且如果您使用异步技术,页面将不会耗尽可用于接收请求的线程池。我认为在异步方法运行时,它会消耗操作系统线程,并且可能仍然会因活动而破坏服务器,但 IIS 会假定它不需要计入它将处理的最大请求数,因此应用程序保持响应。

在此处对这个问题的评论中,我对异步保存是否以及哪些资源感到困惑。我从那次讨论中得到的印象是,没有任何带有关键字“asynch”的技术可以保存任何带有关键字“thread”或“resource”的资源。是否有一些资源被释放用于其他请求,也许我只是没有它的名称?

B 部分。 这个限制是什么,它是高到只有每毫秒 100 次强烈的请求才会达到这个限制,还是足够低到每个运行 15 分钟同步页面的几十个用户可以达到这个限制?

4

1 回答 1

1

Lucian Wischik 是涉及 .NET Async 的规范负责人之一,他使用服务员(在餐厅)的类比来描述异步编程。

“服务员的工作是在一张桌子上等到顾客吃完饭。如果你想同时服务两张桌子,你必须雇两个服务员。”
这不是真的,是吗?为什么?因为你不需要两个服务员!您可以只使用同一个服务员,并在桌子之间分享他。

谈话:异步第 1 部分 - 消息循环和任务类型

因此,与其启动新线程(这很昂贵)来简单地坐下来等待,不如让您的主线程在需要很长时间的请求上放置一种书签。这类似于让您的主要服务员在他们服务的第一张桌子忙于选择点什么或吃什么时检查其他桌子。

现在,如果您的代码正在执行长时间运行的过程,例如处理项目列表,那么异步不会为您节省任何东西。(我想类比是修剪草坪,在这种情况下,您需要两台割草机同时修剪两块草坪。)异步仅在您的代码等待资源可用或请求完成时才有用,例如作为要建立的 Internet 连接或返回结果的查询。它为您节省了与多线程相关的费用和复杂性。

Lucian 在上面的链接中为对异步编程知之甚少或一无所知的人提供了关于该主题的精彩演讲。虽然他的演讲侧重于 .NET 语言应用的异步,但该理论通常扩展到异步编程。

于 2013-05-23T18:32:46.960 回答