异步操作 - MVC

Cer*_*Cer 2 c# async-await asp.net-mvc-5

我知道异步方法的逻辑,但我不明白以下方法如何给我带来好处。以下异步方法与同步方法不同吗?

[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);
}
Run Code Online (Sandbox Code Playgroud)

小智 5

要了解这种做法的好处,首先我们需要了解 ASP.NET 生命周期的工作原理。

每次我们向服务器发出请求时,管道都会检索一个线程池线程来处理它,并且与每个资源一样,线程池中可用于此目的的线程数量是有限的。

一些操作,例如 I/O 或数据库操作,通常会阻塞处理,持续时间比预期的要长。

当管道达到可用资源的限制时,它所能做的就是等待其中一些资源被释放,以便它可以处理新的请求。

当等待/异步方法开始起作用时,由于其内部工作原理,运行时可以异步处理这些任务,释放线程池线程以处理另一个请求,而前一个请求被阻塞。这通常会导致使用相同的可用资源获得更高的总吞吐量,但代价是每个请求的处理成本略高。

这里有一个简单的解释。

我希望它能帮助你。