首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步操作- MVC

异步操作- MVC
EN

Stack Overflow用户
提问于 2017-03-10 18:43:54
回答 2查看 4K关注 0票数 2

我知道异步方法的逻辑,但我不明白下面的方法如何给我带来优势。下面的异步方法和同步方法有区别吗?

代码语言:javascript
复制
[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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-10 19:13:07

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

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

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

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

当await/async方法生效时,由于其内部工作方式,运行时可以异步处理这些任务,从而在前一个请求被阻塞时释放线程池线程来处理另一个请求。这通常会在使用相同可用资源的情况下导致更高的总体吞吐量,但代价是每个请求的处理成本略高。

Here给出一个简单的解释。

我希望它能帮助你。

票数 5
EN

Stack Overflow用户

发布于 2017-03-10 19:06:07

从客户端的角度来看,Async方法不会改变任何东西。它将是普通http调用(完成请求的时间几乎相同)。然而,您将在您的web服务器上获得更好的伸缩性。

Ex-对于代码中的以下几行,只要任何异步操作正在进行,工作线程(这是处理请求)将被返回到线程池。该线程可以自由处理下一个请求。当异步操作完成时,将从线程池中挑选线程进行进一步处理。

代码语言:javascript
复制
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

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42716406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档