【问题标题】:How to prevent Deadlock with Usermanager?如何防止用户管理器死锁?
【发布时间】:2020-03-27 22:51:10
【问题描述】:

我在 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 内的返回值的异步调用?

【问题讨论】:

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


    【解决方案1】:

    制作一切 async - 根据需要返回 Tasks 和 awaiting。不要打电话给.Result.Success。让编译器帮你写出更好的异步代码。

    例如使HandleValidSubmit异步。

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

    async void 应该只用于事件类型的事情,因为它们类似于“一劳永逸”。

    【讨论】:

    • 啊。我没想到 HandleValidSubmit 可能是异步的 :)
    • 不应该HandleValidSubmit 然后返回Task
    • @Nkosi 这取决于OnValidSubmit 的实现方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多