2012-04-23 144 views
2

我一直在阅读更多关于C#的新异步关键字和它在.NET 4.5中的支持,我正在寻找一些帮助来思考它是'正确的方式'。异步和web请求处理

我的第一个想法是,我可以通过不需要等待的事情(比如发送电子邮件,记录日志等等)异步地提高我网站的响应速度。这是我想要开火并忘记的事情,而不是让我的客户等待。

但后来我读了SQL here的新异步版本,我感到困惑。从数据库中读取数据是我必须等待的 - 我需要这些数据 - 并且在完成之前我无法继续。这是否意味着我不能使用它?

或者,这是否意味着我通过不阻止SQL调用使得我的请求处理更友善?

+0

您可以使用它。诀窍不是等待结果,而是执行其他操作,并在结果到达时继续使用原始代码。这就是新的'await'关键字所做的。 – CodesInChaos 2012-04-23 12:24:38

回答

1

这些事情的答案总是“取决于”。

在您的特定情况下,如果您正在向IIS提供请求,那么您绝对要尽可能利用此功能,但必须以有利于IIS的方式进行操作。

例如,当一个客户端向一个ASP.NET页面发出请求时(我认为是这种情况,并且询问有关IIS和.NET的问题,这实际上是唯一的选择),服务器启动了一个线程处理您的请求。当然,如果有很多请求,那么它会占用很多线程,可能比服务器可以处理的多,这意味着一些请求必须等待而其他进程正在处理。

如果在你的线程中(这是阻塞服务器上的其他线程),你必须等待其他工作其他地方,那么在等待响应(来自网络服务,数据库等)。最好让服务器返回线程,然后告诉服务器何时您准备再次工作并提供响应。

为此,ASP.NET有机制让服务器知道它可以在等待响应时执行其他操作。 (ASP.NET MVC)有asynchronous pages(我个人觉得有些复杂),而ASP.NET MVC有asynchronous methods in version 4(这很适合Task-based asynchronous pattern)。

这就是说,它应该指出的是,如果你有一个具有在等待响应独立完成其他的工作,那么就没有理由产生线程返回到服务器,只是做你的工作,当你已经达到了无法进一步发展的地步,收回控制权。

不管你做什么,不要等待任务的结果;您在阻止服务器使用该线程进行其他用途时,您无所事事,但正在等待。这可能是可扩展性的最大障碍,并且学习不需要占用服务器资源是编写高度可扩展系统的关键之一。