在MVC 5中使用异步有什么好处?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

有什么区别:

public ActionResult Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        IdentityResult result = IdentityManager.Authentication.CheckPasswordAndSignIn(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
        if (result.Success)
        {
            return Redirect("~/home");
        }
        else
        {
            AddErrors(result);
        }
    }
    return View(model);
}

和:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        IdentityResult result = await IdentityManager.Authentication.CheckPasswordAndSignInAsync(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
        if (result.Success)
        {
            return Redirect("~/home");
        }
        else
        {
            AddErrors(result);
        }
    }
    return View(model);
}

我发现MVC代码现在有异步,但有什么不同。一个人比另一个人有更好的表现吗?调试一个比另一个更容易吗?我是否应该对其他控制器进行更改以添加Async?

提问于
用户回答回答于

只有在执行I / O绑定操作(如远程服务器调用)时,异步操作才有用。异步调用的好处是,在I / O操作期间,不会使用ASP.NET工作线程。下面是第一个例子的工作原理:

  1. 当一个请求到达动作时,ASP.NET从线程池中取出一个线程并开始执行它。
  2. IdentityManager.Authentication.CheckPasswordAndSignIn方法被调用。这是一个阻塞调用 - >在整个调用过程中,工作线程正在受到危害。

以下是第二个电话的工作原理:

  1. 当一个请求到达动作时,ASP.NET从线程池中取出一个线程并开始执行它。
  2. IdentityManager.Authentication.CheckPasswordAndSignInAsync被称为其立即返回。一个I / O完成端口被注册并且ASP.NET工作线程被释放到线程池中。
  3. 稍后当操作完成时,会发出I / O完成端口信号,从线程池中绘制另一个线程以完成返回视图。

正如你在第二种情况中所看到的,ASP.NET工作线程仅在短时间内使用。这意味着池中有更多线程可用于服务其他请求。

所以总结一下,只有当你有一个真正的异步API时才使用异步操作。如果你在异步操作中进行阻止呼叫,则可能会造成整体效益。

用户回答回答于

通常,单个HTTP请求将由单个线程处理,从池中彻底删除该线程,直到返回响应。通过TPL,你不受这个限制。任何进来的请求都会开始计算每个计算单元的延续,以计算能够在池中的任何线程上执行的响应。使用这个模型,你可以处理比标准ASP.Net更多的并发请求。

如果它是一个新的任务将会产生,或者不是,以及是否应该等待。总是考虑那些70毫秒,这是约。最大。任何方法调用应该采取的时间。如果时间更长,那么你的用户界面很可能不会觉得响应速度很快。

扫码关注云+社区