如何使用Usermanager防止死锁?

时间:2020-03-27 14:43:46

标签: c# asp.net-core async-await asp.net-identity blazor-server-side

我在blazor(服务器)上有一个注册页面。在该页面上,我想使用AspnetCor.Identity实现注册功能

这是方法:(_ usermanager的类型为AspNetCore.Identity.UserManager <>)

  public bool Register(RegisterUser regUser)
    {
        var newUser = new ApplicationUser { Email = regUser.Mail, UserName = regUser.Mail};           
        var sd= _userManager.CreateAsync(newUser, "password").Result;
        if (!sd.Succeeded)
        {                
            return false;
        }
        return true;
    }

该方法是在blazor页面上的HandleValidSubmit中调用的:

<EditForm Model="@_registerUser" OnValidSubmit="HandleValidSubmit">
//...
</EditForm>
@code {
      private void HandleValidSubmit()
        {
            if (identity.Register(_registerUser)) {
              NaviationManager.NavigateTo($"/manage/registersent");
            }
        }
}

当注册失败时,它按照设计返回false的方式工作。但是当注册没问题的时候,我最终陷入_userManager.CreateAsync(newUser, "password").Result;

的死锁中

当我不尝试使异步调用同步并用_userManager.CreateAsync(newUser, "password")替换该调用(并且完全忽略任何返回值)时,就可以毫无问题地创建用户。

我应该如何处理HandleValidSubmit内部具有返回值的异步调用?

1 个答案:

答案 0 :(得分:2)

使所有内容async-返回Task,并await适当地添加它们。请勿致电.Result.Success。让编译器帮助您编写更好的异步代码。

例如使HandleValidSubmit异步。

private async void HandleValidSubmit()
{
    if (await identity.RegisterAsync(_registerUser)) 
    {
        NaviationManager.NavigateTo($"/manage/registersent");
    }
}

async void仅应用于事件类型的事物,因为它们类似于“即发即弃”。