我将建立一个Asp.net MVC 3网页。
:视图(web页面)调用大约五个Ajax(jQuery)方法,这些方法在控制器中返回JsonResult,并在web页面上呈现结果。
Control:控制器方法使用EF4读取Server 2008数据库。根据服务器负载的不同,执行两个SQL语句可能需要半分钟时间。
我希望用户能够尽快看到从快速控制器/数据库调用返回的内容。这个页面不会有太多的用户(可能多达15个)。如果长期运行控制器方法不是异步的,那么它们会阻塞其他控制器吗?或者,只要线程池足够大,足以处理用户的峰值请求,这是无关紧要的吗?
发布于 2011-07-15 17:59:33
如果长期运行控制器方法不是异步的,那么它们会阻塞其他控制器吗?
首先要注意的是,所有这些控制器操作都不应该有对会话的写访问权。如果它们写入会话,无论它们是同步的还是异步的,它们总是按顺序执行,永远不会并行执行。这是因为ASP.NET会话并不是线程安全的,如果来自同一会话的多个请求到达,它们将排队。如果你只是在读会话内容,那就没问题了。
现在,慢控制器操作不会阻止快速控制器操作。不管它们是否同步。对于长时间的控制器操作,只有在使用异步ADO.NET方法访问数据库并因此受益于I/O完成端口时,才能使它们异步。它们允许您在I/O操作(如数据库访问)期间不使用任何线程。如果使用对数据库的标准阻塞调用,则异步操作不会带来任何好处。
我建议您使用下列条款来更深入地了解什么时候异步操作可能是有益的。
发布于 2011-07-15 17:58:49
从用户的角度来看,加载初始网页是同步的,也就是说,他必须等到服务器交付页面。但是,Ajax请求在他看来是异步的,因为他已经可以看到页面的一部分。
从服务器的角度来看,一切都是同步的。有一个HTTP请求需要处理,答案是HTML、JSON或其他什么。客户端将等待直到收到答案。几个请求可以并行处理。
因此,除非您实现了一些阻止某些请求的特殊锁定(无论是在web服务器上还是在数据库中),否则不会阻塞任何东西。
对我来说,提议的方法似乎还不错。
更新:
有一件事我忘记了: ASP.NET包含一种锁定机制,用于同步对会话数据的访问,如果您有来自同一个用户的几个并发请求,就会以这种方式进行访问。查看一下SessionState
属性,以找到解决该问题的方法。
更新2:
从用户的角度来看,对于异步行为,不需要使用AsyncController
类。它们是为其他东西而构建的,这与您的情况无关,因为只有15个用户。
https://stackoverflow.com/questions/6711007
复制相似问题