两者之间有什么区别:
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 代码现在具有异步功能,但有什么区别。一个提供的性能是否比另一个好得多?调试一个问题比调试另一个更容易吗?我应该为我的应用程序更改其他控制器以添加异步吗?
执行 I/O 绑定操作(如远程服务器调用(时,异步操作才有用。异步调用的好处是在 I/O 操作期间,不使用 ASP.NET 工作线程。因此,这是第一个示例的工作原理:
- 当请求命中该操作时,ASP.NET 从线程池中获取线程并开始执行它。 调用
IdentityManager.Authentication.CheckPasswordAndSignIn
方法。这是一个阻塞调用 ->在整个调用期间,工作线程受到危害。
以下是第二个调用的工作原理:
- 当请求命中该操作时,ASP.NET 从线程池中获取线程并开始执行它。
- 调用立即返回的
IdentityManager.Authentication.CheckPasswordAndSignInAsync
。注册 I/O 完成端口,并将 ASP.NET 工作线程释放到线程池。 - 稍后,当操作完成时,将发出 I/O 完成端口信号,从线程池中提取另一个线程以完成返回视图。
正如您在第二种情况下所看到的 ASP.NET 工作线程仅在短时间内使用。这意味着池中有更多线程可用于处理其他请求。
因此,总而言之,仅当您内部具有真正的异步 API 时才使用异步操作。如果您在异步操作中进行阻止调用,则会扼杀它的全部好处。
通常,单个 HTTP 请求将由单个线程处理,从池中完全删除该线程,直到返回响应。使用 TPL,您不受此约束的约束。传入的任何请求都会从计算能够在池中的任何线程上执行的响应所需的每个计算单元开始延续。使用此模型,您可以处理比标准 ASP.Net 更多的并发请求。
是否是将要生成的新任务,以及是否应该等待。 始终考虑这 70 毫秒,这大约是任何方法调用应花费的最大时间。如果它更长,那么你的 UI 很可能感觉不到响应能力。
在启动时看到大量并发请求或具有突发负载(并发性突然增加(的 Web 应用程序中,使这些 Web 服务调用异步将提高应用程序的响应能力。异步请求的处理时间与同步请求相同。例如,如果请求进行的 Web 服务调用需要两秒钟才能完成,则无论请求是同步执行还是异步执行,请求都需要两秒钟。但是,在异步调用期间,不会阻止线程在等待第一个请求完成时响应其他请求。因此,当有许多并发请求调用长时间运行的操作时,异步请求会阻止请求排队和线程池增长。