异步和Web请求处理

时间:2012-04-23 12:22:42

标签: .net iis asynchronous .net-4.5 async-await

我一直在阅读更多关于C#的新async关键字并在.NET 4.5中支持它,我正在寻找一些帮助,以“正确的方式”思考它。

我的第一个想法是,我可以通过执行我不需要等待的事情(例如发送电子邮件,记录内容等)来提高我的网站的响应能力。这是我想要忘掉并且不让我的客户等待的事情。

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

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

1 个答案:

答案 0 :(得分:1)

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

在您的特定情况下,在您处理来自IIS的请求时,您绝对希望尽可能利用此功能,但您必须以有利于IIS的方式执行此操作。

例如,当客户端向ASP.NET页面发出请求时(我假设是这种情况,问题是关于IIS和.NET,这是唯一的选择),服务器已经启动了一个线程到处理您的请求。当然,如果有很多请求,那么它将占用很多线程,可能比服务器可以处理的更多,这意味着某些请求必须等待其他请求处理。

如果在你的线程中(阻塞服务器上的其他线程)你必须等待其他的其他工作,那么在你等待时阻塞其他线程没有多大意义响应(来自Web服务,数据库等)。最好给服务器提供线程,然后告诉服务器什么时候准备再次工作并提供响应。

为此,ASP.NET有一些机制让服务器知道在等待响应时它可以执行其他操作。

ASP.NET WebForms有asynchronous pages(我个人觉得有点复杂),而ASP.NET MVC有asynchronous methods in version 4(更适合Task-based asynchronous pattern)。

那就是说,应该注意的是,如果你有其他工作必须在等待响应时独立完成,那么没有理由将线程返回给服务器,只是做你的工作,当你到达无​​法继续前进的地步时,控制回来。

无论你做什么,都不要等待任务的结果;你阻止服务器使用该线程进行其他用途,而你却没有做任何事情而是等待。这可能是可扩展性的最大障碍,学习不需要保留服务器资源的地方是编写高度可扩展系统的关键之一。