等待异步功能完成

时间:2014-03-15 01:58:30

标签: c# asp.net-mvc-4 asynchronous asp.net-mvc-5

我有一个问题,我想在进入下一个之前让异步函数先完成。为什么?因为下一行代码需要函数的值。

我试过了,等待wait()RunSynchronous,但它无效。 它仍然继续执行其他代码行。

这是我的代码:它是ASP.NET MVC5的默认登录名,但我想要做的是根据用户更改重定向。

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindAsync(model.UserName, model.Password);
            if (user != null)
            {     
                          SignInAsync(user, model.RememberMe);
                         RedirectToLocal(LogInRedirect());
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

我有一个名为UserDepartment的自定义参数,我只能在SignInAsync(user,model.RememberMe)之后检索它;完成执行。

这是SignInAsync的代码

    private async Task SignInAsync(ApplicationUser user, bool isPersistent)
    {
        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
        var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
         AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); 
    }

在进行其他代码行之前,我应该怎么做才能实现SignInAsync首先完成的目标。

编辑: 所以等待有效,但还有另一个问题。 SignInAsync尚未完成但它已经返回它已完成。完成后我的意思是执行代码,我跟踪执行但有时候AuthenticationManager.SignIn还没有完成但仍然返回它是

1 个答案:

答案 0 :(得分:1)

您需要await SignInAsync来电

的结果
await SignInAsync(user, model.RememberMe);
...

您在内部await UserManager.CreateIdentityAsync方法的结果,以便阻止该结果在SignInAsync方法内返回。但是,在没有等待SignInAsync本身的调用的情况下,代码不会被阻止,这就是为什么立即调用下一行的原因。