【问题标题】:Asynchronous Asp.Net MVC controller methods?异步 Asp.Net MVC 控制器方法?
【发布时间】:2026-01-22 02:50:02
【问题描述】:

我将构建一个 Asp.net MVC 3 网页。

视图:视图(网页)针对方法调用大约五个 Ajax(jQuery) 调用,这些方法在控制器中返回 JsonResult,并在网页上呈现结果。

控制:控制器方法使用 EF4 读取 SQL Server 2008 数据库。其中两条 SQL 语句可能需要半分钟才能执行,具体取决于服务器负载。

我希望用户至少可以尽快看到快速控制器/数据库调用返回的内容。该页面不会有很多用户(可能最多 15 个)。如果它们不是异步的,那么长期控制器方法调用会阻塞其他方法吗?或者只要线程池足够大以处理用户的峰值请求就无关紧要了吗?

【问题讨论】:

    标签: asp.net-mvc ajax asp.net-mvc-3 jquery asynchronous


    【解决方案1】:

    在用户看来,加载初始网页是同步的,即他必须等到服务器交付页面。然而,Ajax 请求在他看来是异步的,因为他已经可以看到页面的一部分。

    从服务器的角度来看,一切都是同步的。有一个 HTTP 请求需要处理,答案是 HTML、JSON 或其他。客户端将等待,直到它收到答案。并且可以并行处理多个请求。

    因此,除非您实施一些特殊的锁定(在 Web 服务器上或在数据库中)来阻止某些请求,否则不会阻止任何内容。

    建议的方法对我来说似乎很好。

    更新:

    我忘记了一件事情:ASP.NET 包含一个锁定机制,用于同步对会话数据的访问,如果您有来自同一用户的多个并发请求,该机制可能会妨碍您。查看SessionState 属性,了解解决该问题的方法。

    更新 2:

    对于从用户的角度来看的异步行为,没有必要使用AsyncController 类。它们是为其他东西而构建的,这与您的情况无关,因为只有 15 个用户。

    【讨论】:

      【解决方案2】:

      如果它们不是异步的,那么长期控制器方法调用会阻塞其他方法吗?

      首先要注意的是,所有这些控制器操作都不应该对 Session 具有写入权限。如果他们写入会话,无论它们是同步还是异步,它们将始终按顺序执行,而不是并行执行。这是因为 ASP.NET 会话不是线程安全的,如果来自同一会话的多个请求到达,它们将被排队。如果您只是从 Session 中读取内容,则可以。

      现在,慢速控制器动作不会阻塞快速控制器动作。不管它们是否同步。对于长控制器操作,仅当您使用异步 ADO.NET 方法访问数据库并因此受益于 I/O 完成端口时,才有意义使它们异步。它们允许您在 I/O 操作(例如数据库访问)期间不消耗任何线程。如果您对数据库使用标准阻塞调用,您将无法从异步操作中获益。

      我会向您推荐 following article,以便更深入地了解异步操作何时可能有益。

      【讨论】:

        最近更新 更多