有什么区别:
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?
答案 0 :(得分:165)
只有在执行远程服务器调用等I / O绑定操作时,异步操作才有用。异步调用的好处是在I / O操作期间,没有使用ASP.NET工作线程。所以这是第一个例子的工作原理:
IdentityManager.Authentication.CheckPasswordAndSignIn
方法。这是一个阻止通话 - &gt;在整个调用过程中,工作线程受到了危害。以下是第二次通话的工作原理:
IdentityManager.Authentication.CheckPasswordAndSignInAsync
,立即返回。注册了I / O完成端口,并将ASP.NET工作线程释放到线程池。正如您在第二种情况中所看到的,ASP.NET工作线程仅在短时间内使用。这意味着池中有更多线程可用于提供其他请求。
总而言之,只有在内部具有真正的异步API时才使用异步操作。如果你在异步操作中进行阻塞调用,那么你就会扼杀它的全部好处。
答案 1 :(得分:2)
通常,单个HTTP请求将由单个线程处理,从池中完全删除该线程,直到返回响应。使用TPL,您不受此约束的约束。任何进入的请求都会启动计算能够在池中任何线程上执行的响应所需的每个计算单元的延续。使用此模型,您可以处理比标准ASP.Net更多的并发请求。
如果是某个新任务将会产生,或者是否应该等待它。总是想想那些70毫秒,这是约。最大任何方法调用应该采取的时间。如果它更长,那么你的UI很可能不会感觉到非常敏感。
答案 2 :(得分:0)
在启动时看到大量并发请求或具有突发加载(并发性突然增加)的Web应用程序中,使这些Web服务调用异步将提高应用程序的响应能力。异步请求与同步请求相同的处理时间。例如,如果请求进行需要两秒钟完成的Web服务调用,则无论是同步执行还是异步执行,请求都需要两秒钟。但是,在异步调用期间,在等待第一个请求完成时,不阻止线程响应其他请求。因此,当有许多并发请求调用长时间运行的操作时,异步请求会阻止请求排队和线程池增长。