【发布时间】:2021-03-18 23:34:48
【问题描述】:
这是一个 Blazor 服务器应用程序。我使用 Serilog,但没有显示任何信息。我希望某处会出现异常,但代码只是存在而没有踪迹。
这是我正在尝试做的简化版本。它在两个 GetRolesAsync 中的任何一个处随机退出:
// Both injected as Scoped at Startup.cs
private UserManager<IdentityUser> _userManager;
private RoleManager<IdentityRole> _roleManager;
public Task<IdentityUser> FetchIdentityUser()
{
// Two users:
var allUsers = _userManager.Users.ToList();
// Two roles:
var allRoles = _roleManager.Roles.ToList();
// Each user is attached to a single role in the db
// (checked via MysqlWorkbench)
var roleNames1 = _userManager.GetRolesAsync(allUsers.First()).Result; // <-- sometimes it exits here (no exception is thrown, no trace of what's going on ...)
var roleNames2 = _userManager.GetRolesAsync(allUsers.Last()).Result; // <-- ...and sometimes it exists here (no exception is thrown, no trace of what's goin on ...)
return Task.FromResult(allUsers.First());
}
【问题讨论】:
-
不应该
FetchIdentityUser()是异步的,然后你会await那两个 GetRolesAsync 调用?不确定,但这会出现在这里更有意义。 -
任何时候你发现自己在输入
.Result,你可能做错了非常非常错误(需要注意的是,对已经完成的任务进行微优化离开状态机; 如果你不知道确切这意味着什么:不要使用.Result) - 你应该使用var roleName1 = await _userManager.GetRolesAsync(allUsers.First());(roleNames2类似) - 并将方法标记为@987654328 @ -
@MarcGravell 你是对的。通常我选择
.Result是因为“异步蠕变”(如果您不小心,它会迅速在您的代码中传播,最终导致一团糟)。例如:我已经以某种方式设计了一个代码,并且在我的代码中一直有一个等待的函数......感谢您的反馈(以及创建 Dapper!;)这使得 db 访问变得更简单和直观) .
标签: c# asp.net-core asp.net-identity blazor blazor-server-side