我知道异步方法的逻辑,但我不明白以下方法如何给我带来优势。以下异步方法是否与同步方法不同?
[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);
}
答案 0 :(得分:3)
要了解这种做法的好处,首先我们需要了解ASP.NET生命周期的工作原理。
每次我们向服务器发出请求时,管道都会检索一个线程池线程来处理它,就像每个资源一样,线程池中有多少线程可用于此目的。
某些操作(例如I / O或数据库操作)通常会阻止处理,持续时间超过预期。
当管道达到可用资源的限制时,它所能做的就是等到其中一些资源被释放,以便它可以处理新的请求。
当await / async方法进入操作时,由于其内部工作原理,运行时可以异步处理这些任务,释放线程池线程以处理另一个请求,同时阻止前一个请求。这通常会导致使用相同的可用资源获得更高的总吞吐量,但代价是每个请求的处理成本略高。
Here关于此的简单解释。
我希望它可以帮到你。
答案 1 :(得分:2)
异步方法不会从客户端角度更改任何内容。这将是正常的http调用(几乎相同的时间完成请求)。但是,您将在Web服务器上获得更好的扩展。
对于代码中的以下行,每当任何异步操作正在进行时,工作线程(即处理请求)将返回到线程池。该线程可以自由处理下一个请求。当异步操作完成时,将从线程池中挑选线程以进行进一步处理。
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
result = await UserManager.AddLoginAsync(user.Id, info.Login);
// and other async methods
要对此进行测试,您可以对此api运行扩展测试,并交叉检查异步控制器与同步控制器所服务的呼叫数。
希望这有帮助。