异步操作 - MVC

时间:2017-03-10 10:43:54

标签: c# asp.net-mvc-5 async-await

我知道异步方法的逻辑,但我不明白以下方法如何给我带来优势。以下异步方法是否与同步方法不同?

[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);
}

2 个答案:

答案 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运行扩展测试,并交叉检查异步控制器与同步控制器所服务的呼叫数。

有关详细信息:https://docs.microsoft.com/en-us/aspnet/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4

希望这有帮助。