我有一个问题,我想在进入下一个之前让异步函数先完成。为什么?因为下一行代码需要函数的值。
我试过了,等待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还没有完成但仍然返回它是
答案 0 :(得分:1)
您需要await
SignInAsync
来电
await SignInAsync(user, model.RememberMe);
...
您在内部await
UserManager.CreateIdentityAsync
方法的结果,以便阻止该结果在SignInAsync
方法内返回。但是,在没有等待SignInAsync
本身的调用的情况下,代码不会被阻止,这就是为什么立即调用下一行的原因。