如何使用 Usermanager 防止死锁?

How to prevent Deadlock with Usermanager?

我在 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");
            }
        }
}

当注册失败时,它会按设计正常工作 returning false。但是当注册没问题时,我最终陷入了 _userManager.CreateAsync(newUser, "password").Result;

的僵局

当我不尝试使异步调用同步并用 _userManager.CreateAsync(newUser, "password") 替换调用(并简单地忽略任何 return 值)时,用户创建时没有问题。

我应该如何处理来自 HandleValidSubmit 的 return 值的异步调用?

使所有内容 async - 返回 Task 并根据需要 await 处理它们。不要调用 .Result.Success。让编译器帮你写出更好的异步代码。

例如使HandleValidSubmit异步。

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

async void 应该只用于事件类型的事物,因为它们类似于 "fire and forget".