gpt4 book ai didi

asp.net-mvc-4 - 如何使 ASP.NET MVC Controller 方法异步

转载 作者:行者123 更新时间:2023-12-05 08:19:15 25 4
gpt4 key购买 nike

我正在对各种 MVC Controller 启动多个 ajax 调用以加载页面的不同部分。然而,当它到达 Controller 时,似乎一次只有一个运行。我猜这是因为默认情况下 ASP.Net MVC Controller 是同步的?我还测试了在 2 个浏览器选项卡上加载一个页面,第二个选项卡总是等待第一个。

为了解决这个问题,我尝试使有问题的 Controller 方法异步。我通过执行以下操作完成了此操作

  1. 将 Async 附加到 Controller 方法名称
  2. 让 Controller 方法返回异步任务
  3. 使用 Task.Factory.StartNew 方法在单独的线程中完成方法中的工作主体。

例如,有问题的 Controller 方法现在看起来像这样......

    public async Task<JsonResult> GetUser(int userId)
{
var result = await Task.Factory.StartNew(() => Task.Run(() =>
{
return userService.GetUser(userId);
})).Result;
return new JsonResult()
{
Data = result,
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}

但是它似乎仍然是同步的。我是否遗漏了什么或以完全错误的方式进行此操作?我并没有真正使用任务库,所以可能遗漏了一些重要的东西?

最佳答案

不,您的假设很可能是错误的。您的问题可能是两个问题中的一个(或两个)。

首先,大多数网络浏览器都有请求限制,即一次只允许对同一服务器发出一定数量的请求。

其次,您可能遇到了 Session 对象的限制,导致使用 session 的多个请求被序列化,因为 Session 本身不是多线程的。

参见 http://tech-journals.com/jonow/2011/10/22/the-downsides-of-asp-net-session-state

简短的回答是,如果您不在操作方法中使用 session ,只需将其添加到方法中...

[SessionState(SessionStateBehavior.Disabled)]
public class AjaxTestController : Controller
{
//...As above
}

如果你只需要读取session,那么这样做:

[SessionState(SessionStateBehavior.ReadOnly)]
public class AjaxTestController : Controller
{
//...As above
}

不过,对于浏览器的限制,您无能为力,因为不同的浏览器有特定的请求限制。这些可以通过注册表(或浏览器配置)条目(通常)进行更改,但在大多数情况下您不能强制用户这样做。

关于asp.net-mvc-4 - 如何使 ASP.NET MVC Controller 方法异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22141795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com