私は非同期メソッドのロジックを知っていますが、以下のメソッドが私にどのように利点を与えるのか理解できません。次の非同期メソッドは同期メソッドと異なりますか?非同期アクション - MVC
[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);
}
はい。データベースが応答するのを待っているスレッドをブロッキング*する代わりに、サーバーは他の作業のためにスレッドを解放します。データベースが応答すると、サーバは 'await'の後に処理を開始します。適度なトラフィックを持つWebサーバーでは、同じ数のスレッドでより多くの要求をサーバーにすることができます。 –
パフォーマンスモニタからわかるように、ブロック操作がno-opsではないため、CPU使用率も低下します。一方では、スレッドがスリープする前にスピンウェイトでブロッキング操作が開始され、CPUが無駄になります。一方、OSは、どのスリープ解除スレッドがブロック解除されたのかを調べる必要があります。したがって、何もないCPU負荷が発生する –
要するに、非同期操作により、同じハードウェアからより多くの要求を処理できます。 –