我知道异步方法的逻辑,但我不明白下面的方法如何给我带来优势。下面的异步方法和同步方法有区别吗?
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
{
if (User.Identity.IsAuthenticated)
{
return RedirectToAction("Index", "Manage");
}
if (ModelState.IsValid)
{
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
if (info == null)
{
return View("ExternalLoginFailure");
}
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
result = await UserManager.AddLoginAsync(user.Id, info.Login);
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
return RedirectToLocal(returnUrl);
}
}
AddErrors(result);
}
ViewBag.ReturnUrl = returnUrl;
return View(model);
}发布于 2017-03-10 19:13:07
为了理解这种做法的好处,我们首先需要了解ASP.NET生命周期是如何工作的。
每次我们向服务器发出请求时,管道都会检索一个线程池线程来处理它,对于每个资源,线程池中可用于此目的的线程数都是有限制的。
一些操作,如I/O或数据库操作,通常会阻塞处理,持续时间比预期的要长。
当管道达到可用资源的限制时,它所能做的就是等待,直到其中一些资源被释放,以便它可以处理新的请求。
当await/async方法生效时,由于其内部工作方式,运行时可以异步处理这些任务,从而在前一个请求被阻塞时释放线程池线程来处理另一个请求。这通常会在使用相同可用资源的情况下导致更高的总体吞吐量,但代价是每个请求的处理成本略高。
Here给出一个简单的解释。
我希望它能帮助你。
发布于 2017-03-10 19:06:07
从客户端的角度来看,Async方法不会改变任何东西。它将是普通http调用(完成请求的时间几乎相同)。然而,您将在您的web服务器上获得更好的伸缩性。
Ex-对于代码中的以下几行,只要任何异步操作正在进行,工作线程(这是处理请求)将被返回到线程池。该线程可以自由处理下一个请求。当异步操作完成时,将从线程池中挑选线程进行进一步处理。
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
result = await UserManager.AddLoginAsync(user.Id, info.Login);
// and other async methods要测试这一点,您可以在此api上运行规模测试,并交叉检查异步控制器和同步控制器所服务的调用数量。
有关更多详细信息,请访问:https://docs.microsoft.com/en-us/aspnet/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4
希望这能有所帮助。
https://stackoverflow.com/questions/42716406
复制相似问题