我将构建一个Asp.net MVC 3网页。
查看:视图(网页)在控制器中调用针对返回JsonResult的方法的五个Ajax(jQuery)调用,并在网页上呈现结果。
控制:控制器方法使用EF4读取SQL Server 2008数据库。其中两个SQL语句可能需要半分钟才能执行,具体取决于服务器负载。
我希望用户至少能够尽快看到快速控制器/数据库调用返回的内容。该页面将没有很多用户(可能最多15个)。如果它们不是异步的话,长期控制器方法会调用阻止其他方法吗?或者只要线程池足够大以处理用户的峰值请求,它是否无关紧要?
答案 0 :(得分:2)
从用户的角度来看,加载初始网页是同步的,即他必须等到服务器传递页面。然而,Ajax请求看起来与他异步,因为他已经可以看到页面的一部分。
从服务器的角度来看,一切都是同步的。有一个HTTP请求需要处理,答案是HTML,JSON或其他。客户端将等到收到答案。并且可以并行处理多个请求。
因此,除非您实施某些阻止某些请求的特殊锁定(在Web服务器或数据库中),否则不会阻止任何内容。
建议的方法对我来说似乎没问题。
<强>更新强>
我忘记了一件事:ASP.NET包含一个锁定机制,用于同步对会话数据的访问,如果您有来自同一用户的多个并发请求,则可能会遇到这种情况。请查看SessionState
属性,了解解决该问题的方法。
更新2:
从用户的角度来看,对于异步行为,不需要使用AsyncController
类。它们是为其他东西构建的,这与您的案例无关,因为只有15个用户。
答案 1 :(得分:1)
如果长期控制器方法不是异步的,那么它们会调用阻塞其他方法吗?
首先要注意的是,所有这些控制器操作都不应具有对Session的写访问权。如果他们写入会话,无论是同步还是异步,它们将始终按顺序执行,而不是并行执行。这是因为ASP.NET Session不是线程安全的,如果来自同一会话的多个请求到达,它们将排队。如果您只是从会话中读取,则可以。
现在,慢速控制器操作不会阻止快速控制器操作。无论它们是否同步。对于长控制器操作,只有在使用异步ADO.NET方法访问数据库并因此受益于I / O完成端口时,才能使它们成为异步。它们允许您在I / O操作(如数据库访问)期间不使用任何线程。如果对数据库使用标准阻塞调用,则无法从异步操作中获益。
我建议您following article深入了解异步操作何时有用。