异步的Asp.Net MVC控制器方法?

3
我将构建一个Asp.net MVC 3网页。
视图:该视图(网页)调用约五个针对控制器中返回JsonResult的方法的Ajax(jQuery)调用,并在网页上呈现结果。
控制器:控制器方法使用EF4读取SQL Server 2008数据库。其中两个SQL语句可能需要半分钟才能执行,具体取决于服务器负载。
我希望用户至少可以尽快看到从快速控制器/数据库调用返回的内容。该页面将不会有很多用户(最多可能达到15个)。如果长时间运行的控制器方法没有异步处理,它们是否会阻塞其他请求?或者只要线程池足够大来处理用户的高峰请求,这就不重要了?
2个回答

2
从用户的角度来看,加载初始网页是同步的,也就是说他必须等待服务器传送页面。然而,Ajax请求对他来说是异步的,因为他已经可以看到页面的一部分。
从服务器的角度来看,一切都是同步的。有一个需要处理的HTTP请求,答案可以是HTML、JSON或其他任何形式。客户端将等待收到答案。可以同时处理多个请求。
所以,除非你实现了一些特殊的锁定(无论是在Web服务器上还是在数据库中),阻止某些请求,否则什么都不会被阻止。
我觉得这个提议很好。
更新:
我忘了一件事:ASP.NET包含一个锁定机制,用于同步访问会话数据,如果您有多个并发请求来自同一用户,可能会遇到问题。查看SessionState属性以解决该问题的方法。
第二次更新:
从用户的角度来看,要实现异步行为,不需要使用AsyncController类。它们是为其他目的而构建的,与您的情况无关,因为只有15个用户。

1
长时间运行的控制器方法调用会阻塞其他方法吗,如果它们不是异步的?
首先要注意的一点是,所有这些控制器动作都不应该对Session进行写操作。无论它们是同步还是异步,如果它们对Session进行写操作,它们总是按顺序执行,而不是并行执行。这是因为ASP.NET Session不是线程安全的,如果多个来自同一会话的请求到达,它们将被排队处理。如果你只是从Session中读取数据,那就没问题。
现在,慢速的控制器动作不会阻塞快速的控制器动作,无论它们是同步还是异步。对于长时间运行的控制器动作,如果你正在使用异步的ADO.NET方法访问数据库,并且从I/O完成端口中受益,则将它们设置为异步可能是有意义的。它们允许你在I/O操作(如数据库访问)期间不消耗任何线程。如果你使用标准的阻塞式调用来访问数据库,那么异步方法将无法获得任何好处。
我建议你阅读以下文章以更深入地了解何时使用异步操作可能会有好处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接