如何使用 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".
我在 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".